最近,我打算使用HttpClient
在网站上模拟操作。
当我通过chrome developer tools
抓住帖子请求时,content-type
属于multipart/form-data
,因此我正在尝试构建MultiPartEntity
来实现它。但我总是得到403 Forbidden。在这种情况下,我确信我的cookie是登录状态,我已经尝试成功执行其他操作。
所以我想知道如何监视httpclient
发送的原始请求,以便我可以将它与真实请求进行比较。非常感谢!
P.S。 在所有多部分中,有一部分显示如下:
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="media_empty"; filename=""
Content-Type: application/octet-stream
我尝试使用FileBody
来表示此部分。但正如您所看到的,文件名和内容都是空的。如果我将新文件(“”)传递给FileBody
,它将抛出异常,指示无法找到该文件。所以现在,我只是使用这段代码:
multiPartEntity.addPart("media_empty", new FileBody(new File("C:\\Users\\zhudi.zd\\Desktop\\BeCJToRCMAA5SdV.jpg-large"), "application/octet-stream"));
希望它能显示解决这个问题的一些线索。
仅供参考以下是来自Chrome开发工具的请求信息以及我的等效代码段:
--Request Headers--
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en,zh-CN;q=0.8,zh;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:50305
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarySYkKonqDITW7A9Bv
Cookie:XXXXXX
Host:upload.twitter.com
Origin:https://target.com
Referer:https://target.com/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36
--Request Payload--
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="post_authenticity_token"
199465e69ee
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="iframe_callback"
window.top.swift_tweetbox_1393907901862
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="in_reply_to_status_id"
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="impression_id"
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="earned"
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="page_context"
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="status"
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="media_data[]"
ABCDEF
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="media_empty"; filename=""
Content-Type: application/octet-stream
------WebKitFormBoundarySYkKonqDITW7A9Bv
Content-Disposition: form-data; name="place_id"
------WebKitFormBoundarySYkKonqDITW7A9Bv--
我的等效代码片段:
MultipartEntity entity = new MultipartEntity();
entity.addPart("post_authenticity_token", new StringBody(loginRequest.getAuthenticity_token()));
entity.addPart("iframe-callback", new StringBody("window.top.swift_tweetbox_"+String.valueOf(System.currentTimeMillis())));
entity.addPart("in-reply-to-status-id", new StringBody(""));
entity.addPart("impression-id", new StringBody(""));
entity.addPart("earned", new StringBody(""));
entity.addPart("page-context", new StringBody(""));
entity.addPart("status", new StringBody("some text here"));
entity.addPart("media_data[]", new StringBody("ABCDEF"));
entity.addPart("media_empty", new FileBody(new File("C:\\1.jpg"), "application/octet-stream")); // trick part, I don't know how to set it as empty file
entity.addPart("place_id", new StringBody(""));
HttpPost post = new HttpPost("https://target.com/post");
post.setHeaders(...);//set all the headers posted above except the Content-Type, for multipartEntity will handle it automatically.
post.setEntity(entity);
response = httpClient.execute(post);
答案 0 :(得分:0)
我在Android上度过了一段悲惨的时光。您可以使用WebScarab拦截浏览器/网站通信(您也可以选择查看原始字节)。基本上,您在浏览器中设置本地代理。这是一个很好的小解决方案。
请注意,如果您使用Apache HTTP Tools中的MultipartEntityBuilder
,则必须将addPart()
方法链接在一起,因为它们各自返回一个新的MulitpartEntityBuilder
,如下面的代码所示:
mpeb = MultipartEntityBuilder.create()
.addTextBody("action", "upload")
.addPart("repo_upload_file", fbp.getBody())
.addTextBody("sesskey", jso.getString("sesskey"))
.addTextBody("repo_id", "3")
.addTextBody("itemid", jso.getString("itemid"))
.addTextBody("author", jso.getString("author"))
.addTextBody("savepath", "/")
.addTextBody("title", current_filename);
答案 1 :(得分:0)
我使用ByteArrayEntity
解决了这个问题,{{1}}会发送Chrome开发工具拦截的原始数据。它现在运作良好。