这个HTTP请求有效吗?

2024-09-30 22:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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--

Tags: 文件form服务器httpdata客户机applicationtype
2条回答

您发送的第一个请求是使用分块传输编码的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头。在

相关问题 更多 >