IoT模块用Java编写GET请求

时间:2017-06-15 08:00:14

标签: java json rest get

我试图从在物联网模块(Advantech WISE-4012)上运行的RESTful网络服务器读取JSON响应。根据文档,任何GET请求都应该以这种形式提出

GET /ai_value/slot_0/ch_0

无论如何,任何GET请求的Java实现(Java库,Apache等)都会在请求的末尾附加协议签名 HTTP / 1.1 。 E.g:

GET http://192.168.0.14/ai_value/slot_0/ch_0 HTTP/1.1

因为这(可能)我到目前为止尝试的每个客户端都收到错误400(错误请求)。我发现的唯一工作方法是通过Google Chrome浏览器上的地址栏发送一个简单的请求(有时我得到回复,有时也会收到错误的请求错误)。 如何按照文档中的描述编写简单明了的GET请求的java实现?如何在不使用HTTP / 1.1的情况下测试自定义GET请求?我尝试的每个chrome扩展程序(Advanced REST Client,Postman)最后添加协议版本,所以我没有机会验证这是否是我收到错误请求错误的原因。

编辑:

这是Advanced REST客户端的响应标头

Connection: close
Content-Type: application/json
Server: WISE-4000/8.1.0020

源消息如下:

GET /ai_value/slot_0/ch_0 HTTP/1.1
HOST: 192.168.0.14

文档之间唯一不匹配的是前面提到的HTTP / 1.1签名。添加"接受:application / json"没有任何区别

2 个答案:

答案 0 :(得分:1)

在深入研究文档之后,看起来默认超时(即720秒)是导致问题的超时。似乎没有任何方法可以解决它(理想情况下,系统应该在成功请求后重置时间,理想情况下,在720秒不活动后,我们应该只获得400 - 或403)。

我想向WISE-4012的API开发人员推荐几点(如果他们与您联系):

  • 添加用于身份验证和超时的简要文档(可能包含更多响应代码和每个错误响应的错误消息)
  • 为API访问启用OAuth

就目前的实施情况而言,我猜你需要做一个基本的auth并在每个请求中传递用户名/密码,或者在每个API请求中添加Authentication头以获得成功的响应,而不需要任何400

答案 1 :(得分:0)

检查这是否有帮助。

HttpClient httpClient = HttpClients.createDefault();
URI reqUri = new URI(<uri>);
RequestBuilder requestBuilder = RequestBuilder.create("GET");
requestBuilder.setUri(reqUri);
requestBuilder.setHeader(<headerKey>, <headerValue>);
requestBuilder.setEntity(<entity_data>);
HttpUriRequest httpRequest = requestBuilder.build();
httpResponse = httpClient.execute(httpRequest);