我用swagger-codegen
制作了一个python服务器。我有一个端点,它接收带有mutlipart/form-data
的文件
还创建了一个带有go-swagger的客户机进行测试。在
已创建要上载的文件:$ echo "123file content321" > data
并使用客户端将文件上载到服务器。生成的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--
但服务器不接受它并响应:
^{pr2}$所以请求没有被正确解析。但是当我使用swagger用户界面时,文件被正确上传。客户机的请求是否有问题,或者服务器有问题?在
编辑:我认为缺少Content-Lenght
,或者身体开头的ff
可能不在那里
编辑2: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--
您发送的第一个请求是使用分块传输编码的HTTP/1.1请求。这意味着主体是由多个块组成的,每个块的前缀是十六进制大小,后跟
\r\n
,然后是数据,再加上\r\n
。我不确定您显示的正文开头的ff
是否真的指定了以下数据的大小(即255字节)。但是,最后一个大小为0的块丢失,因此此请求不完整。但也许你只是把这个问题遗漏了。在除此之外,服务器的响应版本是HTTP/1.0。分块传输编码仅为HTTP/1.1定义,这意味着HTTP/1.0服务器无法理解此请求。甚至不是所有的HTTP/1.1服务器都能理解请求中的分块传输编码,即使它们应该理解。在
您显示的第二个请求(由Chrome创建)不使用分块传输编码,而是在HTTP报头中使用
Content-length
指定报头的长度。这是您应该采取的方式,因为这适用于所有web服务器,包括HTTP/1.0服务器。在基于您发布的两个请求,我将尝试在您的go请求中首先设置
Content-Length
,并测试它。我以前遇到过arangodbhttpapi不接受没有正确内容长度值的请求的问题。在如果成功了那就好了。在
否则,我下一步要做的就是消除您请求中的
ff
。但我首先要关注Content-Length
头。在相关问题 更多 >
编程相关推荐