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发送的请求以进行比较吗?打开开发工具并查看需求