2013-11-04 5 views
2

라우터 웹 사이트에서 일부 데이터를 가져 오려고하지만 POST 요청 헤더를 파악할 수 없습니다.jSoup를 사용하여 POST 할 수 없습니다

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:342 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary6C8rEu8jENa10v7s 
Cookie:AIROS_SESSIONID=48f1f0f41859ba467e3a2bf1de1f6dd0; ui_language=en_US 
Host:10.0.0.2 
Origin:http://10.0.0.2 
Referer:http://10.0.0.2/login.cgi?uri=/index.cgi 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML,  like Gecko) Chrome/30.0.1599.101 Safari/537.36 

을 그리고 여기에 요청 페이로드의 :

여기에 요청 헤더의

------WebKitFormBoundary6C8rEu8jENa10v7s 
Content-Disposition: form-data; name="uri" 

/index.cgi 
------WebKitFormBoundary6C8rEu8jENa10v7s 
Content-Disposition: form-data; name="username" 

ubnt 
------WebKitFormBoundary6C8rEu8jENa10v7s 
Content-Disposition: form-data; name="password" 

ubnt 
------WebKitFormBoundary6C8rEu8jENa10v7s-- 

을 문서로 응답을 구문 분석 및 인쇄, 내 자격 증명이 유효하지 않은 것으로 표시됩니다. 내 Content-Type이 잘못되었을 수 있습니까? 어떤 통찰력을 감상 할 수있다

res1 = Jsoup.connect("http://10.0.0.2/login.cgi") 
.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101  Firefox/25.0") 
.header("Content-Type", "multipart/form-data") 
.followRedirects(false) 
.referrer("http://10.0.0.2/login.cgi?uri=/index.cgi") 
.data("uri", "/index.cgi") 
.data("username", "ubnt").data("password", "ubnt") 
.method(Method.POST).execute(); 

:

다음은 연결에 대한 내 코드입니다!

미리 감사드립니다.

EDIT : 응답을 구문 분석하면 서버가 다음과 같은 오류 메시지를 표시합니다.이 오류 메시지는 웹 사이트에서 Content-Type을 처리하는 방식과 관련이 있다고 의심합니다.

<body> 
    <b>File Upload Error: No MIME boundary found</b> 
    <br /> 
    <b>There should have been a &quot;boundary=something&quot; in the Content-Type string</b> 
    <br /> 
    <b>The Content-Type string was: &quot;multipart/form-data&quot;</b> 
    <br /> 
    <b><i>l10n.inc:</i> Oops, SetCookie called after header has been sent on line 98</b> 
    <br /> 
    <tt> setcookie(&quot;ui_language&quot;, $active_language, 2147483647<b> 
    <blink> 
    ); /* last valid 32 bit time_t */ 
    </blink></b></tt> 

답변

2

좋아, 그냥 해결했습니다!

분명히 서버가 "username", "ubnt", "password", "ubnt"라는 데이터 필드를 기대하지 않았지만 원시 포스트 데이터를 기대하고있었습니다. 에 콘텐츠 형식 변경 :

post.setHeader("Content-Type","multipart/form-data; boundary=---------------------------21240622191493050652355892969"); 

내가 성공적으로 로그인을 얻을 수 있었다

StringEntity postParamsString = new StringEntity("-----------------------------21240622191493050652355892969\r\nContent-Disposition: form-data; name=\"uri\"\r\n\r\n/stalist.cgi\r\n-----------------------------21240622191493050652355892969\r\nContent-Disposition: form-data; name=\"username\"\r\n\r\nubnt\r\n-----------------------------21240622191493050652355892969\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\nubnt\r\n-----------------------------21240622191493050652355892969--\r\n"); 

에 법인을 변경. Peter가 지적했듯이 jSoup은 multipart/form-data를 잘 처리하지 못하기 때문에 Apache Commons로 변경되었지만 jSoup와도 잘 작동했을 것입니다.

관련 문제