Java 传递cookies以获取请求时出现问题(POST后)

Java 传递cookies以获取请求时出现问题(POST后),java,android,http,cookies,jsoup,Java,Android,Http,Cookies,Jsoup,我已经在这个问题上纠缠了好几天了,我的眼睛开始因为尝试不同的组合而疼痛,但没有成功。问题是,我正在制作一个应用程序,它必须从互联网上获取数据,解析数据,然后向用户展示。我尝试了几种方法来实现这一点,使用JSOUP非常有用,特别是在解析和从结果中获取数据方面 然而,有一个问题我无法解决。我已经尝试使用常规的HTTPClient和JSOUP,但无法成功获得所需的数据。以下是我的代码(JSOUP版本): 因此,最终结果将是一个包含返回数据的字符串。但是,无论我尝试什么,我都会得到“空白”页面和解析文本

我已经在这个问题上纠缠了好几天了,我的眼睛开始因为尝试不同的组合而疼痛,但没有成功。问题是,我正在制作一个应用程序,它必须从互联网上获取数据,解析数据,然后向用户展示。我尝试了几种方法来实现这一点,使用JSOUP非常有用,特别是在解析和从结果中获取数据方面

然而,有一个问题我无法解决。我已经尝试使用常规的HTTPClient和JSOUP,但无法成功获得所需的数据。以下是我的代码(JSOUP版本):

因此,最终结果将是一个包含返回数据的字符串。但是,无论我尝试什么,我都会得到“空白”页面和解析文本,并且我模拟了浏览器请求的所有内容

以下是浏览器捕获的POST和GET原始标题: (职位)

(得到)

在这个GET(它的响应)中,我需要的数据被找到了,但是由于参数、cookie或我尝试过的所有东西的任何组合,我无法让它“认为”我发了一篇文章,现在需要这些数据

这是我的代码没有JSOUP解析器的版本,但是我也不能让它工作,尽管当我检查那些cookie时,它们是OK的,POST和get也是一样,但是没有成功

DefaultHttpClient client = new DefaultHttpClient();


                 String postURL = "http://www.bhtelecom.ba/imenik_telefon.html?a=search";
                 HttpPost post = new HttpPost(postURL);
                 post.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);


                 List<NameValuePair> params = new ArrayList<NameValuePair>();
                 params.add(new BasicNameValuePair("di", "035"));
                 params.add(new BasicNameValuePair("br", "819443"));
                 params.add(new BasicNameValuePair("btnSearch","Tra%C5%BEi"));
                 UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
                 post.setEntity(ent);
                 HttpResponse responsePOST = client.execute(post);



                 HttpEntity resEntity = responsePOST.getEntity();  

                 if (resEntity != null) {    
                    //todo
                     }
                 //checking for cookies, they are OK
                 List<Cookie> cookies = client.getCookieStore().getCookies();
                 if (cookies.isEmpty()) {
                      Log.d(TAG, "no cookies");
                 } else {
                     for (int i = 0; i < cookies.size(); i++) {
                          Log.d(TAG, "cookies: " + cookies.get(i).toString());
                     }
                 }
                 resEntity.consumeContent();

                 HttpGet get = new HttpGet("http://www.bhtelecom.ba/index.php?id=3226&");
                 get.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);



                 HttpResponse responseGET = client.execute(get);
                 HttpEntity entityGET = responseGET.getEntity();
                 List<Cookie> cookiesGet = client.getCookieStore().getCookies();
                 if (cookies.isEmpty()) {
                      Log.d(TAG, "no cookies");
                 } else {
                     for (int i = 0; i < cookiesGet.size(); i++) {
                          Log.d(TAG, "cookies GET: " + cookiesGet.get(i).toString());
                     }
                 }

                 //a method to check the data, I pass the InputStream to it, and do the operations, I've tried "manually", and passing the InputStream to JSOUP, but without success in either case.
                 samplemethod(entityGET.getContent());
                 client.getConnectionManager().shutdown();
             } catch (Exception e) {
                 e.printStackTrace();
             }  
DefaultHttpClient=newdefaulthttpclient();
字符串姿势=”http://www.bhtelecom.ba/imenik_telefon.html?a=search";
HttpPost=新的HttpPost(postrl);
post.getParams().setParameter(CoreProtocolPNames.USE\u EXPECT\u CONTINUE,Boolean.FALSE);
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“di”、“035”);
参数添加(新的BasicNameValuePair(“br”,“819443”);
参数添加(新的基本名称对(“BTN搜索”、“Tra%C5%BEi”);
UrlEncodedFormEntity ent=新的UrlEncodedFormEntity(params,HTTP.UTF_8);
邮政实体(ent);
HttpResponse responsePOST=client.execute(post);
HttpEntity当前状态=responsePOST.getEntity();
如果(最近性!=null){
//待办事项
}
//检查是否有饼干,它们没问题
列表cookies=client.getCookieStore().getCookies();
if(cookies.isEmpty()){
Log.d(标记“无饼干”);
}否则{
对于(int i=0;i
所以,如果有人能在我的设置中找到一个错误,或者找到一种方法让我发出这两个请求,然后获取数据,HTTP实体,然后我可以将其用作可爱的JSOUP解析器的输入(InputStream),那将是惊人的。或者我了解了整个页面需要什么,我需要用不同的参数提出请求,我将不胜感激。我使用Wireshark和Charles Debugging Proxy来了解要创建什么(尝试了这两种方法,仔细检查),只找到了会话id、fe_typo_用户和一些用于跟踪站点时间的其他参数等,我也尝试过传递它们,“\u utma”“\u utmb”。。。等等


我有一些其他的方法,使用“更简单”,只发布数据的方法,我已经成功地得到了,但是这个网站的这个具体问题让我发疯。提前感谢您的帮助。

经过许多小时的尝试和跟踪传入/传出数据包,我终于找到了解决方案

问题在于“bug”,即HTTPClient的行为。如果将参数添加到post,并且参数为emty,具有“”值,则该参数不会随请求一起发送。我不知道这一点,并且认为这些参数,因为它们是空的,不会改变任何事情,并且使用JSOUP做一些事情时,我没有将它们传递给请求

所以

都是名胜古迹

另一件事,因为这个页面有302响应,而JSOUP将followRedirects设置为“true”作为默认值,所以我不得不将其设置为false,因为该方法是POST,并且“followUp请求”必须是GET,但JSOUP假设它仍然是POST,并且会把事情搞砸

就这样,希望有人会觉得这很有用:)

> POST /imenik_telefon.html?a=search HTTP/1.1 Host: www.bhtelecom.ba
> Content-Length: 56 Cache-Control: max-age=0 Origin:
> http://www.bhtelecom.ba User-Agent: Mozilla/5.0 (Windows NT 6.1;
> WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202
> Safari/535.1 Content-Type: application/x-www-form-urlencoded Accept:
> text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding:
> gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset:
> ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie:
> PHPSESSID=opavncj3317uidbt93t9bie980;
> fe_typo_user=332a76d0b1d4944bdbbcd28d63d62d75;
> __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
> 
> di=033&br=123456&_uqid=&_cdt=&_hsh=&btnSearch=Tra%C5%BEi
> GET /index.php?id=3226& HTTP/1.1 Host: www.bhtelecom.ba Cache-Control:
> max-age=0 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
> AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1
> Accept:
> text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding:
> gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset:
> ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie:
> PHPSESSID=opavncj3317uidbt93t9bie980;
> __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); fe_typo_user=07745dd2a36a23c64c2297026061a2c2
DefaultHttpClient client = new DefaultHttpClient();


                 String postURL = "http://www.bhtelecom.ba/imenik_telefon.html?a=search";
                 HttpPost post = new HttpPost(postURL);
                 post.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);


                 List<NameValuePair> params = new ArrayList<NameValuePair>();
                 params.add(new BasicNameValuePair("di", "035"));
                 params.add(new BasicNameValuePair("br", "819443"));
                 params.add(new BasicNameValuePair("btnSearch","Tra%C5%BEi"));
                 UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
                 post.setEntity(ent);
                 HttpResponse responsePOST = client.execute(post);



                 HttpEntity resEntity = responsePOST.getEntity();  

                 if (resEntity != null) {    
                    //todo
                     }
                 //checking for cookies, they are OK
                 List<Cookie> cookies = client.getCookieStore().getCookies();
                 if (cookies.isEmpty()) {
                      Log.d(TAG, "no cookies");
                 } else {
                     for (int i = 0; i < cookies.size(); i++) {
                          Log.d(TAG, "cookies: " + cookies.get(i).toString());
                     }
                 }
                 resEntity.consumeContent();

                 HttpGet get = new HttpGet("http://www.bhtelecom.ba/index.php?id=3226&");
                 get.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);



                 HttpResponse responseGET = client.execute(get);
                 HttpEntity entityGET = responseGET.getEntity();
                 List<Cookie> cookiesGet = client.getCookieStore().getCookies();
                 if (cookies.isEmpty()) {
                      Log.d(TAG, "no cookies");
                 } else {
                     for (int i = 0; i < cookiesGet.size(); i++) {
                          Log.d(TAG, "cookies GET: " + cookiesGet.get(i).toString());
                     }
                 }

                 //a method to check the data, I pass the InputStream to it, and do the operations, I've tried "manually", and passing the InputStream to JSOUP, but without success in either case.
                 samplemethod(entityGET.getContent());
                 client.getConnectionManager().shutdown();
             } catch (Exception e) {
                 e.printStackTrace();
             }  
params.add(new BasicNameValuePair("_uqid", ""));
params.add(new BasicNameValuePair("_cdt", ""));
params.add(new BasicNameValuePair("_hsh", ""));