如何从 Java 中的 RESTFul 服务向 Ipstack API 请求 GET

Posted

技术标签:

【中文标题】如何从 Java 中的 RESTFul 服务向 Ipstack API 请求 GET【英文标题】:How to request a GET to Ipstack API from a RESTFul service in Java 【发布时间】:2019-02-05 17:12:50 【问题描述】:

我正在尝试使用 API IPStack 通过 IP 获取用户的位置。此方法与原始方法重载。这个想法是,如果用户收到该位置,则转到另一个功能,如果没有,则通过查找并获取它。也许我应该使用 JQuery 或 php uCurl 如何使用 https://ipstack.com/documentation 的文档示例,但我并没有从 Eclipse 和 Java 中做到这一点(这是必须的),所以我仍然像 RESTful 服务一样尝试它,但什么也没有。

public Users newUser(String username, String email) 
    Client cliente = ClientBuilder.newClient();
    WebTarget servicio = cliente.target(MONGODB + MONGOCOLL + "?apiKey=" + MONGOKEY);

    try 
        JSONObject user = new JSONObject();
        JSONObject location = new JSONObject();
        user.put("username", username);
        user.put("email", email);

        ArrayList<String> following = new ArrayList<String>();
        user.put("following", following);
        ArrayList<String> friends = new ArrayList<String>();
        user.put("friends", friends);

        String ipstackfields = "&output=json&fields=country_name,city,zip";
        Client clientipstack = ClientBuilder.newClient();
        WebTarget ipstackserv = clientipstack
                .target(IPSTACK + IPSTACKEND + "?apiKey=" + IPSTACKKEY + ipstackfields);
        Response resplocated = ipstackserv.request().get();
        String slocate = resplocated.readEntity(String.class);
        JSONObject located = new JSONObject(slocate);

        location.put("country", located.get("country_name"));
        location.put("city", located.get("city"));
        location.put("postcode", located.get("zip"));
        user.put("location", location);

        Response respuesta = servicio.request().post(Entity.json(user.toString()));

        if (respuesta.getStatus() == Status.OK.getStatusCode()) 
            // TODO: leer la respuesta de la llamada y trasformar el objeto
            // JSON a un mensaje para devolverlo
            String s = respuesta.readEntity(String.class);
            JSONObject usuario = new JSONObject(s);
            return JSONtoUser(usuario);
         else 
            return null;
        
     catch (Exception e) 
        return null;
    

【问题讨论】:

【参考方案1】:

您的代码似乎在服务器端执行。当您的方法newUser 被调用时,您需要从请求标头中检索客户端 IP 并将其传递给 Geolocation API。

要查找的请求标头取决于您的服务器和配置,但通常称为Client-IPX-Forwarded-For

获得客户端 IP 后,需要在使用 Ipstack 查询参数之前附加它。

仅供参考,我建议查看Ipregistry 以获得比 Ipstack 更快、更可靠的解决方案(免责声明:我运行该服务)。以下是使用 Ipregistry 传递您的信息的方法:

https://api.ipregistry.co/54.85.132.205?key=tryout

其中54.85.132.205tryout 必须分别替换为您的客户端IP 和您的API 密钥。

【讨论】:

以上是关于如何从 Java 中的 RESTFul 服务向 Ipstack API 请求 GET的主要内容,如果未能解决你的问题,请参考以下文章

WCF RESTFul服务中的异常处理

如何响应 RESTful Web 服务中的备用 URI

如何从 android 调用 RESTful Web 服务?

RESTful Web 服务中的文件下载

如何从Android调用RESTful Web服务?

如何通过类对象作为方法参数的RESTful服务吗