【问题标题】:Easy way to access webservices with GET queries?使用 GET 查询访问 Web 服务的简单方法?
【发布时间】:2013-09-18 19:53:51
【问题描述】:

我正在尝试创建一个小型 Java 客户端,它可以通过查询调用 GET 网络服务。想象一下这样的气体/燃料网络服务:

http://mywebservice.com/search.xml?lat=50.5&lng=30.33&fuels=Diesel&radius=2

理想情况下,我应该有一个网站,用户可以在其中输入位置、燃料、以公里为单位的半径等信息。

我最好使用什么技术来简化 Web 服务调用?

目前我正在像这样手动构建查询:

stringbuilder.append("http://mywebservice.com/search.xml?lat=")
.append(latField.getText())
.append("&lng=")
.append(lngField.getText())
.append("&fuels=")
.append(fuelsField.getText())
.append("&radius=")
.append(radiusField.getText());

你明白了。

我在质疑:调用 web 服务查询有什么更聪明的方法吗?你是怎么做到的?如何改进?

【问题讨论】:

    标签: java web-services jakarta-ee


    【解决方案1】:

    您可以使用 JAX-RS 轻松构建/部署/调用此 REST 端点。

    客户端可能看起来像:

    Client client = ClientBuilder.newClient();
    WebTarget target = client.target(".../gas");
    MultivaluedHashMap<String, String> map = new MultivaluedHashMap<>();
    map.add("lat", "50.5");
    map.add("lng", "30.33");
    map.add("fuels", "Diesel");
    map.add("radius", "2");
    target.request().post(Entity.form(map));
    

    类似的客户端代码位于:

    https://github.com/arun-gupta/javaee7-samples/blob/master/jaxrs/jaxrs-client/src/main/java/org/javaee7/jaxrs/client/TestJAXRS2Client.java

    端点可能如下所示:

    @Path("/gas")
    public class GasService {
    
    @POST
    public String post(@FormParam("lat")String lat, @FormParam("lng")String lng) {
        // search based upon lat, lng, etc
    }
    }
    

    完整的端点定义位于:

    https://github.com/arun-gupta/javaee7-samples/blob/master/jaxrs/jaxrs-client/src/main/java/org/javaee7/jaxrs/client/MyResource.java

    【讨论】:

      【解决方案2】:

      一个著名的库是: http://hc.apache.org/httpcomponents-client-4.3.x 它非常简单灵活。

      For your usecase you could do something like:
      URI uri = new URIBuilder()
              .setScheme("http")
              .setHost("www.google.com")
              .setPath("/search")
              .setParameter("q", "httpclient")
              .setParameter("btnG", "Google Search")
              .setParameter("aq", "f")
              .setParameter("oq", "")
              .build();
      HttpGet httpget = new HttpGet(uri);
      System.out.println(httpget.getURI());
      

      完整示例及更多内容: http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fundamentals.html#d5e49

      【讨论】:

        【解决方案3】:

        我很喜欢春天,所以我可以推荐你休息模板: http://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate

        给出的例子是:

        Map<String, String> vars = new HashMap<String, String>();
        vars.put("hotel", "42");
        vars.put("booking", "21");
        String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars);
        

        为了匹配您的问题,可能会变成:

        Map<String, String> vars = new HashMap<String, String>();
        vars.put("lat", latField.getText());
        vars.put("lng", lngField.getText());
        vars.put("fuels", fuelsField.getText());
        vars.put("radius", radiusField.getText());
        String result = restTemplate.getForObject("http://mywebservice.com/search.xml?lat={lat}&lng={lng}&fuels={fuels}&radius={radius}", String.class, vars);
        

        【讨论】:

          【解决方案4】:

          您可以使用标准框架编写 Web 服务客户端,具体取决于 Web 服务的类型。例如,Axis2 表示基于 SOAP,Jersey 表示基于 REST。

          【讨论】:

            【解决方案5】:

            最后我使用org.apache.cxf.jaxrs.client.WebClient如下:

            WebClient.create("http://mywebservice.com/search.xml")
                .query("lat", 50.5)
                .query("lng", 30.33)
                .query("fuels", "Diesel")
                .query("radius", 2)
                .get(Search.class);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-05-16
              • 1970-01-01
              • 1970-01-01
              • 2016-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多