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