我发现使用apache http client在Java中执行简单的http请求很困难。该请求是对以下网址http://109.231.121.64:20622/v1/collections/S4C/objects/OpsConfig/data(当前正在运行)的简单GET。请求使用curl成功,如下所示:
curl -v -X GET http://109.231.121.64:20622/v1/collections/S4C/objects/OpsConfig/data > s4cOpsInitModel.xml
这是输出:
* Hostname was NOT found in DNS cache
* Trying 109.231.121.64...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:----:--:-- 0* Connected to 109.231.121.64 (109.231.121.64) port 20622 (#0)
> GET /v1/collections/S4C/objects/OpsConfig/data HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 109.231.121.64:20622
> Accept: */*
>
< HTTP/1.1 200 OK
< connection: keep-alive
* Server Cowboy is not blacklisted
< server: Cowboy
< date: Tue, 08 Sep 2015 08:11:22 GMT
< content-length: 2349
< content-type: application/octet-stream
<
{ [data not shown]
100 2349 100 2349 0 0 27819 0 --:--:-- --:--:----:--:-- 27964
* Connection #0 to host 109.231.121.64 left intact
但是当在Java中执行相同操作时,返回了http错误状态500秒。这是我正在使用的代码:
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet getRequest = new HttpGet(
"http://109.231.121.64:20622/v1/collections/S4C/objects/OpsConfig/data");
HttpResponse response = httpClient.execute(getRequest);
if (response.getStatusLine().getStatusCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatusLine().getStatusCode());
}
BufferedReader br = new BufferedReader(
new InputStreamReader((response.getEntity().getContent())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
httpClient.getConnectionManager().shutdown();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我看了谷歌,但我无法弄清楚发生了什么。我的猜测是接受的内容类型有问题,但我尝试设置不同类型的内容类型而没有成功。你对我做错了什么了解吗?提前谢谢大家。
答案 0 :(得分:0)
解决了,它似乎与接受的内容类型有关。将以下标头添加到http请求使其工作。
getRequest.setHeader("accept", "*/*");
答案 1 :(得分:0)
我今天也遇到了这个问题但出于不同的原因。我正在绞尽脑汁。就在我向共享点发出http请求的时候。
卷曲 - 工作得很好。 Http客户端没有。
花了很长时间才意识到这一点,但这是因为我在手动请求中发送的FedAuth
和rtFa
Cookie会以某种方式干扰保存到Cookie存储区并发送的Cookie背部。所以第一个请求可以正常工作,然后第二个请求就会出错。
解决方案是在每次请求之前清除cookie存储区,或者如果它们已经存在于cookie存储区中,则不在请求中设置rtfa fedauth cookie。