java - Play Framework 2.x : How do i make a HTTP-GET for an reverse lookup (nominatim OSM)?

标签 java json playframework playframework-2.0 httprequest

我想用 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/

相关文章:

Play 2.2.1 中的 SSL\TLS 支持

Java PostgreSQL arrayList<Object[]> 插入代码-应用于任意数量的列

java - 使用 pcap4J 解密 HTTPS 数据包

javascript - 需要基于现有对象在 Javascript 中创建对象,考虑到其性能,这是有效的

Python pandas to_json() 格式无效

playframework - 在 Play 中导入 CRUD 模块! 1.2.3

java - 在 Apache Spark 上为每个 worker 创建一个单例

java - 编写查询来删除 3 分钟内未 ping 服务器的节点

javascript - 从 laravel Controller 返回 json 时尝试获取非对象的属性 'id'

json - Play Json 中的验证错误(路径丢失)