7

我正在使用以下代码从 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 地址。任何帮助将非常感激。

4

6 回答 6

8

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

于 2012-10-30T23:48:09.587 回答
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();
    }
于 2012-10-02T05:10:18.673 回答
2

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

hc.addResponseInterceptor(new HttpResponseInterceptor() {
    @Override
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
        response.getEntity().writeTo(System.out);
    }
});
于 2012-10-09T13:24:49.243 回答
1

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

于 2017-02-04T14:58:51.640 回答
0

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

根本错误是:

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

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

希望它可以帮助某人。

于 2019-03-05T17:28:21.937 回答
-2

就我而言,我已从 pom 文件中删除了以下依赖项并解决了该问题:

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.9</version>
    </dependency>
于 2019-08-28T12:23:02.827 回答