400使用Java客户端从OData服务进行响应

400使用Java客户端从OData服务进行响应,java,odata,Java,Odata,该网站演示了如何“分6步”使用OData服务。我被直接放在主页上的示例的第3步卡住了。我故意只使用标准的Java7库。下面的代码生成400响应。我已经通过在Chrome中尝试相同的查询来验证URL是否正确 谁能告诉我如何仅使用标准Java 7库成功完成步骤3 URL url = new URL("http://services.odata.org/V4/TripPinServiceRW/People?$top=2&$filter=Trips/any(d:d/Budget gt 3000)

该网站演示了如何“分6步”使用OData服务。我被直接放在主页上的示例的第3步卡住了。我故意只使用标准的Java7库。下面的代码生成400响应。我已经通过在Chrome中尝试相同的查询来验证URL是否正确

谁能告诉我如何仅使用标准Java 7库成功完成步骤3

URL url = new URL("http://services.odata.org/V4/TripPinServiceRW/People?$top=2&$filter=Trips/any(d:d/Budget gt 3000)");
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestProperty("accept", "application/json");
c.setRequestProperty("Content-Type", "application/json");
c.setRequestMethod("GET");

BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));

String input;
StringBuilder sb = new StringBuilder();
while ((input = in.readLine()) != null) {
    sb.append(input);
}
in.close();

System.out.println(sb);

尝试将c.getInputStream更改为c.getOutputStream :

BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
->

顺便说一下,如果您想创建一个java客户端来使用OData服务,我建议您使用ApacheOlingoJava客户端,这是一个显示查询OData服务有多容易的测试用例:

for (Customer customer : container.getCustomers()) 
{ 
  assertNotNull(customer);  
  count++;  
}

嗯,您需要对URL上的空格进行如下编码:URL URL=新URLhttp://services.odata.org/V4/TripPinServiceRW/People?$top=2和$filter=Trips/anyd:d/预算%20gt%203000

以下是工作代码:

URL url = new URL("http://services.odata.org/V4/TripPinServiceRW/People?$top=2&$filter=Trips/any(d:d/Budget gt 3000)");
URL urlToEncode = new URL(url);
URI uri = new URI(urlToEncode.getProtocol(), urlToEncode.getUserInfo(), urlToEncode.getHost(), urlToEncode.getPort(), urlToEncode.getPath(), urlToEncode.getQuery(), urlToEncode.getRef());

HttpURLConnection c = (HttpURLConnection) uri.toURL().openConnection();
c.setRequestProperty("accept", "application/json");
c.setRequestMethod("GET");

BufferedReader in = new BufferedReader(newInputStreamReader(c.getInputStream()));

查看更多信息

我没有执行URI编码,因为我在www.odata.org网站上完成了步骤1和步骤2,但没有这样做。然而,作为一种最佳实践,我将从现在开始一直执行编码。谢谢
URL url = new URL("http://services.odata.org/V4/TripPinServiceRW/People?$top=2&$filter=Trips/any(d:d/Budget gt 3000)");
URL urlToEncode = new URL(url);
URI uri = new URI(urlToEncode.getProtocol(), urlToEncode.getUserInfo(), urlToEncode.getHost(), urlToEncode.getPort(), urlToEncode.getPath(), urlToEncode.getQuery(), urlToEncode.getRef());

HttpURLConnection c = (HttpURLConnection) uri.toURL().openConnection();
c.setRequestProperty("accept", "application/json");
c.setRequestMethod("GET");

BufferedReader in = new BufferedReader(newInputStreamReader(c.getInputStream()));