httpClient.execute中的ClientProtocolException(httpget,responseHandler)

时间:2012-10-02 04:54:50

标签: java android http http-get

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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();
    }

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我遇到了类似的问题ClientProtocolException
显然服务器没有目标Web服务SSL
因此SSL配置错误

根本错误是:

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

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

希望它可以帮助某人。

答案 5 :(得分:-1)

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

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