我想用 PlayFramework (java) 做一个简单的 HTTP GET 但它不起作用。我在 play 2.x 的文档中搜索了很多内容,但没有任何帮助。文档中的示例也没有帮助。
我想编写一个调用反向地理定位服务(例如 this )并返回 JSON 数据的方法。我需要响应数据作为 JsonNode 或类似的东西。
我尝试了 Play 主页中的以下代码,它应该会返回一条道路的名称,但它没有用。
public static Promise<Result> reverseLookup() {//String lat, String lon
final Promise<Result> resultPromise = WS.url("http://nominatim.openstreetmap.org/reverse?format=json&lat=51.510809&lon=-0.092875").get().map(
new Function<WS.Response, Result>() {
public Result apply(WS.Response response) {
return ok("Road:" + response.asJson().findPath("road"));
}
}
);
return resultPromise;
}
我在这里遇到了这个错误:
[RuntimeException: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: org.jboss.netty.buffer.ChannelBufferInputStream@6a43dbaf; line: 1, column: 2]]
如果 this url,则 JSON 数据中没有像“<”这样的字符在浏览器中手动调用。
请帮帮我。我不明白。
编辑晚上 10:25:
我试过了 response.getBody()
但输出是一样的。
我不明白错误可能在哪里... 这是更多代码:
路线:
POST /other/function controllers.myController.anotherFunction()
我的 Controller :
private static String reverseLookupData;
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result anotherFunction() {
// the gps coordinates are passed to this method (this works up to this point)
reverseLookup(String lat, String lon); // reverse lookup starts
System.out.println("Response 1: " + reverseLookupData);
System.out.println("Response 2: " + reverseLookup().toString());
// some code ...
}
public static Promise<String> reverseLookup(String lat, String lon) {
final Promise<String> resultPromise = WS.url("http://nominatim.openstreetmap.org/reverse?format=json&lat="+ lat +"&lon=" + lon).get().map(
new Function<WS.Response, String>() {
public String apply(WS.Response response) {
reverseLookupData = response.getBody();
return "Data:" + reverseLookupData;
}
}
);
return resultPromise;
}
如果我运行这段代码,命令行窗口的输出是:
Response 1: null
Response 2: play.libs.F$Promise@51ebebed
编辑
(...)
public String apply(WS.Response response) {
System.out.println("Body: " + response.getBody());
return "";
}
(...)
现在我在这里收到这条错误信息:
Body: <?xml version="1.0" encoding="UTF-8" ?>
<reversegeocode timestamp='Sun, 06 Apr 14 21:31:45 +0000' attribution='Data ┬® OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright' querystring=''>
<error>Unable to geocode</error></reversegeocode>
有人知道为什么会出现这种情况或错误可能出在哪里吗? 正如我所说,当我将地理编码地址输入浏览器时,我会得到正确的答案。
我试过谷歌反向地理编码,但还是不行
网址:
"http://maps.googleapis.com/maps/api/geocode/json?latlng=51.510809,-0.092875&sensor=false&key={myServerKey}",
"http://maps.googleapis.com/maps/api/geocode/json?latlng=51.510809,-0.092875&sensor=false"
传感器是真还是假,都不起作用:
Body: {
"error_message" : "The 'sensor' parameter specified in the request must be set to either 'true' or 'false'.",
"results" : [],
"status" : "REQUEST_DENIED"
}
我很感激任何帮助:)
最佳答案
WS.url("http://nominatim.openstreetmap.org/reverse")
.withQueryParameter("format", "json")
.withQueryParameter("lat", lat)
.withQueryParameter("lon", lon)
关于java - Play Framework 2.x : How do i make a HTTP-GET for an reverse lookup (nominatim OSM)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897111/