使用GET查询轻松访问Web服务?

时间:2013-09-18 19:53:51

标签: java web-services java-ee

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

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

理想情况下,我有一个网站,用户可以输入位置,燃料,半径等信息,等等。

我可以最好地使用哪种技术来简化网络服务调用?

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

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());

你明白了。

我在质问:调用网络服务查询有什么更聪明的吗?你好吗?怎么可以改善呢?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一个众所周知的图书馆是: 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

答案 2 :(得分:0)

我很喜欢春天,所以我建议你休息模板: 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);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

最后我最终使用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);