【问题标题】:ClientProtocolException in httpClient.execute(httpget, responseHandler)httpClient.execute(httpget, responseHandler) 中的 ClientProtocolException
【发布时间】:2012-10-02 04:54:50
【问题描述】:

我正在使用以下代码从 Web 服务器请求 xml:

HttpClient httpclient = new DefaultHttpClient() try { HttpGet httpget = new HttpGet("http://63.255.173.242/get_public_tbl.cgi?A=1"); ResponseHandler responseHandler = new BasicResponseHandler(); String responseBody = httpclient.execute(httpget, responseHandler); System.out.println(responseBody); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { httpclient.getConnectionManager().shutdown(); }

当我调用 httpclient.execute(httpget, responseHandler) 时,我得到一个 clientProtocolException。 url 在 web 浏览器中工作得很好,它返回 xml 并且浏览器显示它。

任何想法为什么我会得到一个 clientProtocolException 而浏览器却能很好地处理它?

编辑 1:

查看协议异常,详细消息是:“服务器未能以有效的 HTTP 响应进行响应”。我无法更改正在访问的 Web 服务器。有没有办法忽略这一点而只访问响应?

编辑 2:

我发现服务器没有发回完整的标头。即使返回了损坏的标头,是否有办法访问响应的内容?

编辑 3:我将 IP 地址编辑为我要访问的真实 IP 地址。任何帮助将不胜感激。

【问题讨论】:

  • 解决方案是什么。我遇到了同样的问题

标签: java android http http-get


【解决方案1】:

由于您的代码似乎是正确的,您必须弄清楚:这是客户端的错误(无效请求)还是服务器的错误(无效响应)。为此,请使用http trace utitlity 并将浏览器的请求与您的客户端的请求进行比较。如果有的话,您还可以看到来自服务器的原始响应。如果您无法弄清楚,请将原始请求和响应添加到您的问题中,有人可能会提供帮助。

【讨论】:

  • 我知道服务器没有发回有效的响应,因为标头不完整。但是服务器不能改变。这是我正在为其实现功能的第 3 方服务器。无论如何,我知道必须有一种方法可以访问原始响应并整理出我想要的数据。我发布的是我的要求。有没有更好的办法?
  • 我发现服务器根本没有发送header。最好的解决方案是直接与套接字通信。
  • @Kevin 你最终对这个问题做了什么,我遇到了同样的问题?
【解决方案2】:

我已经用我的 IP 地址测试了你的代码。代码没有错误。我刚刚将ResponseHandler 更改为BasicResponseHandler

检查一下

 HttpClient httpclient = new DefaultHttpClient();
    try 
    {
        HttpGet httpget = new HttpGet("http://www.MyServer.com/get_public_tbl.cgi?A=1");               
        BasicResponseHandler responseHandler = new BasicResponseHandler();//Here is the change
        String responseBody = httpclient.execute(httpget, responseHandler);
        System.out.println(responseBody);
    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } 
    finally 
    {
        httpclient.getConnectionManager().shutdown();
    }

【讨论】:

  • 这是对我的代码的一个很好的改进,但并没有解决问题。
【解决方案3】:

您可以尝试添加自己的响应拦截器,您可以在其中添加或删除标头,或打印一些调试信息

hc.addResponseInterceptor(new HttpResponseInterceptor() {
    @Override
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
        response.getEntity().writeTo(System.out);
    }
});

【讨论】:

  • 我添加了一个响应拦截器,但是在抛出协议异常之前没有调用 process 方法。如果我点击了发送有效标头的服务器,则会调用 process 方法。还有其他想法吗?
  • 你可以用void process(HttpRequest request, HttpContext context)同样的方法添加new HttpRequestInterceptor,然后打印和比较来自浏览器和你的代码的请求头。可能是服务器 w8“Accept-Encoding”、“gzip”标头或其他
【解决方案4】:

检查您在客户端中设置的标头,重新验证标头的键和值。就我而言,我使用的是“csrf”参数而不是“Cookie”。

【讨论】:

    【解决方案5】:

    我遇到了类似的问题,ClientProtocolException
    显然服务器没有目标 Web 服务 SSL
    所以这是错误的 SSL 配置,

    根本错误是:

      java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    

    将信任库添加到 java 后,此错误消失了。

    希望它对某人有所帮助。

    【讨论】:

      【解决方案6】:

      在我的例子中,我从 pom 文件中删除了以下依赖项并解决了问题:

          <dependency>
              <groupId>org.apache.httpcomponents</groupId>
              <artifactId>httpclient</artifactId>
              <version>4.5.9</version>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        相关资源
        最近更新 更多