Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这个HTTP请求有效吗?_Python_Http_Go_Httprequest_Swagger - Fatal编程技术网

Python 这个HTTP请求有效吗?

Python 这个HTTP请求有效吗?,python,http,go,httprequest,swagger,Python,Http,Go,Httprequest,Swagger,我用swagger-codegen制作了一个python服务器。我有一个端点接收带有mutlipart/form数据的文件 还创建了一个用于测试的客户端 已创建要上载的文件:$echo“123文件内容321”>数据 并使用客户端将文件上载到服务器。生成的HTTP请求如下所示: POST /api/order/1/attachment HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: Go-http-client/1.1 Transfer-Encoding: ch

我用
swagger-codegen
制作了一个python服务器。我有一个端点接收带有
mutlipart/form数据的文件

还创建了一个用于测试的客户端

已创建要上载的文件:
$echo“123文件内容321”>数据

并使用客户端将文件上载到服务器。生成的HTTP请求如下所示:

POST /api/order/1/attachment HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Go-http-client/1.1
Transfer-Encoding: chunked
Accept: application/json
Content-Type: multipart/form-data; boundary=5f3f0ad86e6345b77c869cbe0a5e608f038354cf9ceab74ec2533d7555c0
Accept-Encoding: gzip

ff
--5f3f0ad86e6345b77c869cbe0a5e608f038354cf9ceab74ec2533d7555c0
Content-Disposition: form-data; name="file"; filename="data"
Content-Type: application/octet-stream

123file content321

--5f3f0ad86e6345b77c869cbe0a5e608f038354cf9ceab74ec2533d7555c0--
但服务器不接受它并响应:

HTTP/1.0 400 BAD REQUEST
Connection: close
Content-Length: 120
Content-Type: application/problem+json
Date: Fri, 19 May 2017 15:15:44 GMT
Server: Werkzeug/0.12.1 Python/3.6.1
{
  "type": "about:blank",
  "title": "Bad Request",
  "detail": "Missing formdata parameter 'file'",
  "status": 400
}
因此请求没有被正确解析。但是当我使用Swigger ui时,文件被正确上传。客户端的请求是否有问题,或者服务器是否有问题

编辑:我认为缺少
内容长度
,或者正文开头的
ff
可能不存在

EDIT2:swagger ui请求:

POST /api/order/1/attachment HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 211
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypzmNwrDR7zzpZ7SJ
Accept: application/json
X-Requested-With: XMLHttpRequest
DNT: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8

------WebKitFormBoundarypzmNwrDR7zzpZ7SJ
Content-Disposition: form-data; name="file"; filename="data"
Content-Type: application/octet-stream

123file content321

------WebKitFormBoundarypzmNwrDR7zzpZ7SJ--

根据您发布的两个请求,我将尝试首先在您的go请求上设置
内容长度
,并进行测试。我以前遇到过ArangodbHTTPAPI不接受没有正确内容长度值的请求的问题

如果成功了,那么是的


否则,你请求中的
ff
就是我下一步要处理的事情。但是我会首先关注
内容长度
标题。

基于您发布的两个请求,我会尝试在您的go请求上首先设置
内容长度
,并测试它。我以前遇到过ArangodbHTTPAPI不接受没有正确内容长度值的请求的问题

如果成功了,那么是的


否则,你请求中的
ff
就是我下一步要处理的事情。但是我会首先关注
内容长度
头。

您发送的第一个请求是使用分块传输编码的HTTP/1.1请求。这意味着主体由多个块组成,其中每个块的前缀为十六进制大小,后跟
\r\n
,后跟数据,再次是
\r\n
。我不确定您显示的正文开头的
ff
是否真的指定了以下数据的大小(即255字节)。但是,缺少大小为0的最后一个块,因此此请求不完整。但也许你只是忽略了这个问题中缺失的部分

除此之外,服务器正在以HTTP/1.0版本响应。分块传输编码仅为HTTP/1.1定义,这意味着HTTP/1.0服务器无法理解此请求。而且,即使所有HTTP/1.1服务器应该理解请求中的分块传输编码,也不是所有的HTTP/1.1服务器都能理解


您显示的第二个请求(由Chrome创建)不使用分块传输编码,而是使用HTTP头中的
Content length
指定头的长度。这是您应该采取的方式,因为它适用于所有web服务器,包括HTTP/1.0服务器。

您发送的第一个请求是使用分块传输编码的HTTP/1.1请求。这意味着主体由多个块组成,其中每个块的前缀为十六进制大小,后跟
\r\n
,后跟数据,再次是
\r\n
。我不确定您显示的正文开头的
ff
是否真的指定了以下数据的大小(即255字节)。但是,缺少大小为0的最后一个块,因此此请求不完整。但也许你只是忽略了这个问题中缺失的部分

除此之外,服务器正在以HTTP/1.0版本响应。分块传输编码仅为HTTP/1.1定义,这意味着HTTP/1.0服务器无法理解此请求。而且,即使所有HTTP/1.1服务器应该理解请求中的分块传输编码,也不是所有的HTTP/1.1服务器都能理解


您显示的第二个请求(由Chrome创建)不使用分块传输编码,而是使用HTTP头中的
Content length
指定头的长度。这是您应该采取的方式,因为这适用于所有web服务器,包括HTTP/1.0服务器。

客户端和服务器需要在HTTP 1.1和1.0之间进行协商,因为服务器使用HTTP 1.0;如果您控制了服务器,只需将属性
protocol\u version=“HTTP/1.1”
添加到BaseHTTPRequestHandler子类(请参见
“详细信息”):“缺少formdata参数'file'”
似乎希望它是
file=“name”
而不是
name=“file”
name=“file”是正确的,我认为,因为这是表单参数的名称。我错过了HTTP版本不匹配的问题。我使用
python-mswagger\u服务器运行测试服务器
我可以添加一些参数来使用
HTTP/1.1
运行
BaseHTTPServer
吗?或者以某种方式配置flask框架?好吧,我们需要服务器的源代码来知道为什么它认为这是一个错误的请求,因为我认为它的格式很好。你能发布由swagger ui发送的请求以进行比较吗?打开开发工具并查看请求。这可能会对此有所启发。客户端和服务器需要在HTTP 1.1和1.0之间进行协商,因为服务器正在使用HTTP 1.0;如果您控制了服务器,只需将属性
protocol\u version=“HTTP/1.1”
添加到BaseHTTPRequestHandler子类(请参见
“详细信息”):“缺少formdata参数'file'”
似乎希望它是
file=“name”
而不是
name=“file”
name=“file”是正确的,我认为,因为这是表单参数的名称。我错过了HTTP版本不匹配的问题。我使用
python-mswagger\u服务器运行测试服务器
我可以添加一些参数来使用
HTTP/1.1
运行
BaseHTTPServer
吗?或者以某种方式配置flask框架?好吧,我们需要服务器的源代码来知道为什么它认为这是一个错误的请求,因为我认为它的格式很好。你能发布由swagger ui发送的请求以进行比较吗?打开开发工具并查看需求