【问题标题】:DefaultHttpClient hangs after second post request (Android)DefaultHttpClient 在第二次发布请求后挂起(Android)
【发布时间】:2014-08-14 20:23:00
【问题描述】:

我在过去几个小时里一直在解决一个问题,但我似乎一辈子都无法解决。

我有一个应用程序将用户登录到我的服务器,并将一些数据添加到 httppost 实体。第一次将数据添加到实体中时一切正常。第二次向服务器发送任何 post 请求时,客户端会挂起直到超时。

我的 DefaultHttpClient 作为全局变量存储在我的应用程序中,并在调用 load_client() 时加载到我的类中。当pairs 变量中没有任何内容时一切正常,但是一旦在setEntity 中第二次设置pairs 变量,程序就永远不会到达“收到响应”消息。

httppost = new HttpPost(format_url(base_url,controller));
logger.info("Sending Post Request");
load_client();
try {
    logger.info("Setting Entity");
    httppost.setEntity(new UrlEncodedFormEntity(pairs,"UTF-8"));
    for(NameValuePair pair : pairs){
        logger.info(pair.getName() + " : " + pair.getValue());
    }
    logger.info("URL Encoded");
    response = httpclient.get_client().execute(httppost);
    logger.info("Received response");

    HttpEntity entity = response.getEntity();
    StatusLine statusLine = response.getStatusLine();

    logger.info("Status: " + statusLine.toString());
    is = entity.getContent();
    logger.info("Content: " + is.toString());

}catch(Exception e){
    logger.error("Error in http connection "+e.toString());
}

任何帮助将不胜感激。除了保存旧客户端的 cookie 并在每次我想发出 Post 请求时将新对象传递给应用程序之外,我现在真的不知道该怎么做。这似乎是解决问题的坏方法。

编辑:这是客户端超时后的消息。当 post 请求中没有数据时,它永远不会被抛出。

Error in http connection org.apache.http.NoHttpResponseException: The target server failed to respond

编辑:好的,我将这个错误缩小到一行。

DefaultHttpClient defhttpClient = new DefaultHttpClient();
logger.info("URL Encoded");
//When I pass the cookies things stop working...
//defhttpClient.setCookieStore(httpclient.get_cookies());
response = defhttpClient.execute(httppost);
logger.info("Received response");

如果我创建一个新的 DefaultHttpClient 并使用参数运行 post 请求,则客户端可以与服务器正常通信。唯一的问题是我需要来自旧客户端的 cookie 来告诉服务器当前用户是谁。当我从旧客户端获取 cookie 并将它们提供给新客户端时,应用程序挂起。我什至没有看到请求进入我的服务器。我想我可能只需要为这个发一个新帖子...

【问题讨论】:

  • 它无法响应收到的响应,因为可能抛出了一个异常。抓住它,记录它,显示堆栈跟踪。

标签: android post url-encoding apache-commons-httpclient basicnamevaluepair


【解决方案1】:

好像有连接问题。下面的链接有类似的问题,所以它可能会有所帮助: org.apache.http.NoHttpResponseException: The target server failed to respond

【讨论】:

  • 如果我在没有任何参数的情况下发出请求或手动拨打电话,则连接有效。问题是我不能多次使用 defaulthttpclient 向请求中添加参数。每次为实体设置参数时,是否需要重置某些内容?我现在唯一要关闭的是解析数据后的输入流。
  • 我不确定这个问题。第一次使用参数可以连接吗?
  • 是的。我对出了什么问题有了更多了解。似乎 cookie 在第一次通过客户端发送 post 参数后阻止 defaulthttpclient 使用 post 参数。我查看了 cookie 中的实际内容,似乎它只是一个附加值的 s.id。创建一个新客户端允许我发送帖子参数,但是如果没有来自旧客户端的 cookie,会话就会丢失。我真的不知道。这在我迁移服务器之前工作得很好,然后完全停止工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2021-08-17
  • 2015-11-06
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多