我试图了解HTTP协议的工作原理,所以我尝试向Java Socket手动添加标头,以向httpbin.org发送请求,如下所示:
BufferedWriter wr = new BufferedWriter(/*socket Outputstream*/)
wr.write("POST post HTTP/1.1\r\n");
wr.write("Host: httpbin.org\r\n");
wr.write("Accept: */*\r\n");
wr.write("Content-Length: "+data.length()+"\r\n");
wr.write("Content-Type: multipart/form-data; boundary=---WebKitFormBoundary67\r\n");
wr.write("\r\n");
wr.write(data);
wr.flush();
在上面的代码data
中,HTTP请求的有效负载看起来完全如下:
---WebKitFormBoundary67
Content-Disposition: form-data; name="field1"
value1
---WebKitFormBoundary67
Content-Disposition: form-data; name="field2"; filename="example.txt"
Java is better when it run long
---WebKitFormBoundary67--
但是服务器httpbin.org不能识别附加的文件,我丢失了什么吗?
答案 0 :(得分:2)
multipart/form-data
是RFC 2046中定义的多部分MIME消息。 multipart/form-data
邮件示例中的分段MIME邮件的基本结构如下:
Content-type: multipart/form-data; boundary=foo
--foo
Content-Disposition: form-data; name=key1
abcde
--foo
Content-Disposition: form-data; name=key2; filename=foo.txt
01234
--foo--
如您所见,边界foo
在border属性中定义,用--foo
用作各部分之间的定界符,并用--foo--
用作最终边界。
您的代码将边界定义为不是foo
,而是定义为--foo
,然后尝试仍然仅使用--foo
作为零件之间的分隔符。要更正代码,您可能需要将边界设置为仅-WebKitFormBoundary67
而不是---WebKitFormBoundary67
,或者使用-----WebKitFormBoundary67
作为分隔符而不是仅---WebKitFormBoundary67
。