通过JSR 311及其实现,我们有了一个通过REST公开Java对象的强大标准。然而,在客户端,似乎缺少了一些类似于Apache Axis for SOAP的东西——隐藏web服务并将数据透明地封送回Java对象的东西。

如何创建Java RESTful客户端?使用HTTPConnection和手动解析结果?或者专门的客户端,例如Jersey或Apache CXR?


当前回答

正如我在这篇文章中提到的,我倾向于使用Jersey,它实现了JAX-RS,并附带了一个很好的REST客户机。好的事情是,如果您使用JAX-RS实现RESTful资源,那么Jersey客户端可以重用JAXB/XML/JSON/Atom等实体提供程序,因此您可以在服务器端重用与在客户端单元测试中使用相同的对象。

例如,下面是来自Apache Camel项目的一个单元测试用例,它从RESTful资源(使用JAXB对象Endpoints)查找XML有效负载。resource(uri)方法定义在这个基类中,它只使用Jersey客户机API。

e.g.

clientConfig = new DefaultClientConfig();
client = Client.create(clientConfig);

resource = client.resource("http://localhost:8080");
// let's get the XML as a String
String text = resource("foo").accept("application/xml").get(String.class);        

顺便说一句,我希望未来版本的JAX-RS能像Jersey那样添加一个很好的客户端API。

其他回答

试着看看http-rest-client

https://github.com/g00dnatur3/http-rest-client

这里有一个简单的例子:

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

库为您处理json的序列化和绑定。

这是另一个例子,

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

最后一个例子,

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

干杯!

泽西休息客户端的例子

添加依赖项:

<!-- Jersey -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.8</version>
</dependency>
    
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

对于GetMethod,并传递两个参数:

Client client = Client.create();
WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

ClientResponse response1 = webResource1.get(ClientResponse.class);
System.out.println("responser is" + response1);

GetMethod传递一个参数并获得一个List类型的响应:

Client client = Client.create();
 
WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
//value changed
String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);
 
List <String > Assignedlist = new ArrayList<String>();
JSONArray jsonArr2 = new JSONArray(response1);
for (int i =0;i<jsonArr2.length();i++){
        
    Assignedlist.add(jsonArr2.getString(i));    
}

上面它返回一个列表,我们将其作为list对象接受,然后将其转换为JSONArray,然后从JSONArray转换为list。

Post请求传递JSONObject作为参数:

Client client = Client.create();
WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
// value added

ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, mapper.writeValueAsString(user));

if (response.getStatus() == 500) {

    context.addMessage(null, new FacesMessage("User already exist "));
}

你可以试试拉帕。让我们知道你的反馈。 并随时记录问题或预期的功能。

由于没有人提到,这里有另一个:Feign,由Spring Cloud使用。

正如我在这篇文章中提到的,我倾向于使用Jersey,它实现了JAX-RS,并附带了一个很好的REST客户机。好的事情是,如果您使用JAX-RS实现RESTful资源,那么Jersey客户端可以重用JAXB/XML/JSON/Atom等实体提供程序,因此您可以在服务器端重用与在客户端单元测试中使用相同的对象。

例如,下面是来自Apache Camel项目的一个单元测试用例,它从RESTful资源(使用JAXB对象Endpoints)查找XML有效负载。resource(uri)方法定义在这个基类中,它只使用Jersey客户机API。

e.g.

clientConfig = new DefaultClientConfig();
client = Client.create(clientConfig);

resource = client.resource("http://localhost:8080");
// let's get the XML as a String
String text = resource("foo").accept("application/xml").get(String.class);        

顺便说一句,我希望未来版本的JAX-RS能像Jersey那样添加一个很好的客户端API。