通过java套接字使用HTTP协议上传文件
我试图理解HTTP协议是如何工作的,所以我尝试手动将头添加到java套接字,以向httpbin.org发送请求,如下所示:通过java套接字使用HTTP协议上传文件,java,sockets,http,multipartform-data,Java,Sockets,Http,Multipartform Data,我试图理解HTTP协议是如何工作的,所以我尝试手动将头添加到java套接字,以向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
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没有识别任何附加的文件,我丢失了什么吗?
多部分/表单数据
是中定义的多部分MIME消息。多部分/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
在边界属性中定义,用作带有--foo
的零件之间的分隔符,并用作最终边界--foo-->
您的代码不是将边界定义为foo
,而是定义为--foo
,然后仍尝试仅使用--foo
作为零件之间的分隔符。要更正代码,您需要将边界设置为仅-WebKitFormBoundary67
,而不是--WebKitFormBoundary67
,或者使用--WebKitFormBoundary67
作为分隔符,而不是仅--WebKitFormBoundary67
,谢谢,我意识到,我只需在有效负载中的分隔符之前给出-
来分隔参数。此外,在显示的原始数据中,字段1
的MIME头和MIME正文之间缺少一条空行,就像字段2
中存在一条空行一样。这意味着value1
被视为field1
的未知MIME头,而不是它的文本值我不知道这是如何显示http协议的工作原理的?只是任意的服务器配置等和首选项?@Marshallcraft我认为这是典型的浏览器在网页中提交带有文件上载的表单时所做的。协议只是一套规则,两个系统同意在没有任何麻烦的情况下进行通信。上面的问题试图遵循中定义的规则,所以任何HTTP服务器都可以识别我发送给它的信息类型。由于我未能正确遵循约定,目标服务器无法识别我正试图发送的数据。