用于Java的REST客户端?

java rest client

292363 观看

18回复

3553 作者的声誉

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

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

作者: Yaba 的来源 发布者: 2008 年 10 月 21 日

回应 (18)


5

16105 作者的声誉

我使用Apache HTTPClient来处理所有HTTP方面的事情。

我为XML内容编写XML SAX解析器,将XML解析为对象模型。我相信Axis2也暴露了XML - >模型方法(Axis 1隐藏了这部分,令人讨厌)。XML生成器非常简单。

在我看来,编码并不需要很长时间,效率也很高。

作者: JeeBee 发布者: 21.10.2008 11:04

70

8701 作者的声誉

正如我在这个帖子中提到的,我倾向于使用Jersey来实现JAX-RS并且带有一个不错的REST客户端。好的是,如果使用JAX-RS实现RESTful资源,那么Jersey客户端可以重用实体提供程序,例如JAXB / XML / JSON / Atom等等 - 这样您就可以重用服务器端的相同对象了用于客户端单元测试。

例如,这是来自Apache Camel项目的单元测试用例,它从RESTful资源(使用JAXB对象端点)查找XML有效负载。资源(uri)方法在此基类中定义,该基类仅使用Jersey客户端API。

例如

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

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

顺便说一下,我希望JAX-RS的未来版本能够在Jersey中添加一个不错的客户端API

作者: James Strachan 发布者: 21.10.2008 12:58

10

299 作者的声誉

您还可以检查具有完整客户端功能的Restlet,更多面向REST的低级库,例如HttpURLConnection或Apache HTTP Client(我们可以利用它作为连接器)。

最诚挚的问候,Jerome Louvel

作者: Jerome Louvel 发布者: 21.10.2008 06:35

7

0 作者的声誉

你可以试试Rapa。请告诉我们您的反馈意见。并随时记录问题或预期功能。

作者: HariKrishnan 发布者: 02.09.2009 11:05

61

133917 作者的声誉

您可以使用标准Java SE API:

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

或者,您可以使用由JAX-RS实现(如Jersey)提供的REST客户端API。这些API更易于使用,但在类路径上需要额外的jar。

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

有关更多信息,请参阅

作者: bdoughan 发布者: 20.08.2010 06:20

181

36196 作者的声誉

决定

这是一个老问题(2008)所以现在有比以往更多的选择:

更新大约2014年:

块上的新孩子提供NIO支持(虽然我不认为这真的会提高客户端的性能,就像服务器一样)。

2016年更新

  • OkHttp - 支持更新的HTTP协议(SPDY和HTTP2)。适用于Android。不幸的是,它没有提供真正的基于反应器循环的异步选项(参见上面的Ning和HTTP组件)。但是,如果您使用较新的HTTP2协议,这不是一个问题(假设连接计数有问题)。
  • Retrofit - 将基于类似于某些Jersey和CXF扩展的接口存根自动创建客户端。使用OkHttp。
  • Apache HttpComponents 5应该具有HTTP2支持

关于选择HTTP / REST客户端的警告。确保检查您的框架堆栈用于HTTP客户端的内容,它如何进行线程化,并且如果它提供了一个,则理想情况下使用相同的客户端。也就是说,如果您使用Vert.x或Play之类的东西,您可能想尝试使用其支持客户端参与框架提供的任何总线或反应器循环......否则请为可能有趣的线程问题做好准备。

作者: Adam Gent 发布者: 17.02.2011 02:48

11

14572 作者的声誉

如果您只想调用REST服务并解析响应,可以尝试Rest Assured

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");
作者: Johan 发布者: 24.02.2011 08:47

6

1257 作者的声誉

我想指出另外两个选择:

作者: Ophir Radnitz 发布者: 25.12.2011 07:48

4

59289 作者的声誉

尝试JdkRequestjcabi-HTTP(我是一个开发者)。这是它的工作原理:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

查看此博客文章了解更多详情:http//www.yegor256.com/2014/04/11/jcabi-http-intro.html

作者: yegor256 发布者: 29.04.2012 12:11

1

1491 作者的声誉

虽然它很简单,可以创建一个HTTP客户端并进行反应。但是如果你想使用一些自动生成的客户端,你可以使用WADL来描述和生成代码。

您可以使用RestDescribe生成和编译WSDL,您可以使用它生成php,ruby,python,java和C#中的客户端。它生成了干净的代码,并且在代码生成后你必须稍微调整一下这是一个很好的改变,你可以在这里找到工具背后的良好文档和基本思想。

在wintermute上提到的有趣且有用的WADL工具很少。

作者: GG. 发布者: 13.01.2013 12:48

1

126 作者的声誉

我写了一个将java接口映射到远程JSON REST服务的库:

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}
作者: George Georgovassilis 发布者: 04.04.2014 07:20

7

9348 作者的声誉

我最近在广场试过了Retrofit Library,非常棒,你可以很容易地调用你的其他API。基于注释的配置允许我们摆脱大量的锅炉板编码。

作者: Yasitha Chinthaka 发布者: 07.06.2014 09:09

1

856 作者的声誉

试着看看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

干杯!

作者: g00dnatur3 发布者: 20.07.2014 01:32

1

1258 作者的声誉

jersey Rest客户端的示例:
添加依赖项:

         <!-- 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>

ForGetMethod并传递两个参数:

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

In Above It返回一个List,我们接受它作为List,然后将其转换为Json Array,然后将Json Array转换为List。

如果Post Request将Json Object作为参数传递:

   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 "));
    }
作者: abhishek ringsia 发布者: 23.09.2014 10:43

5

748 作者的声誉

OkHttp与Retrofit结合使用时重量轻且功能强大。这适用于一般的Java使用以及Android。

OkHttphttp//square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

改造http//square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
作者: Sam Edwards 发布者: 16.11.2015 02:18

2

3345 作者的声誉

有一段时间了,我一直在使用Resty

JSONResource jsonResource = new Resty().json(uri);

人们可以在这里找到一些例子。

作者: aribeiro 发布者: 02.02.2016 03:46

4

1531 作者的声誉

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

作者: Leon 发布者: 28.04.2018 02:19

0

31 作者的声誉

Java也有很多Rest Clients。比如For Spring Boot你可以使用 RestTemplate UniRest RestAssured For Simple Rest应用程序在Java中你可以使用 Jersey Client。

作者: Shubham 发布者: 05.09.2019 01:45
32x32