为Java留下客户端?

通过JSR 311及其实现,我们拥有通过Rest展示Java对象的强大标准。 然而,在客户端,似乎缺少一些与Apache Axis for SOAP相当的东西 - 这些东西隐藏了Web服务,并将数据透明地编组回Java对象。

你如何创建Java RESTful客户端? 使用HTTPConnection并手动解析结果? 或者是针对Jersey或Apache CXR的专业客户端?


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

  • Apache CXF有三个不同的REST客户端选项
  • 泽西岛 (上面提到)。
  • Spring也有自己的RestTemplate
  • Commons HTTP Client构建您自己的旧Java项目。
  • 更新大约在2014年:

  • 由Sonatype提供的Async-http-client 。 Ning Async-http-client。
  • 该块提供NIO支持的新成员(尽管如此,我认为这不会像服务器那样真正提高客户端的性能)。

  • Apache HTTP组件(4.2)Fluent适配器 - 比旧的Commons HTTP Client 3更好,并且更容易用于构建自己的REST客户端。 您必须使用像JSON这样的JSON解析支持,并且您可以使用HTTP组件URIBuilder来构造类似于Jersey / JAX-RS Rest客户端的资源URI。 HTTP组件也支持NIO,但由于REST的简短请求性质,我怀疑你会比BIO获得更好的性能。
  • 2016年更新

  • OkHttp - 支持更新的HTTP协议(SPDY和HTTP2)。 适用于Android。 不幸的是,它不提供真正的基于反应器循环的异步选项(参见上面的Ning和HTTP组件)。 但是,如果您使用较新的HTTP2协议,这不是一个问题(假设连接数是问题)。
  • 改造 - 将自动创建基于类似于泽西岛和CXF扩展的接口存根的客户端。 使用OkHttp。
  • Apache HttpComponents 5将被认为具有HTTP2支持
  • 关于选择HTTP / REST客户端的警告。 确保检查你的框架堆栈用于HTTP客户端,它是如何进行线程化的,并且理想情况下使用相同的客户端(如果它提供的话)。 也就是说,如果你使用类似Vert.x或Play的东西,你可能想要使用它的支持客户端来参与框架提供的任何总线或者反应器循环,否则就要为可能有趣的线程问题做好准备。


    正如我在这个线程中提到的,我倾向于使用实现了JAX-RS的Jersey,并带有一个不错的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


    您可以使用标准的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); 
    

    有关更多信息,请参阅

  • http://bdoughan.blogspot.com/2010/08/creating-restful-web-service-part-55.html
  • 链接地址: http://www.djcxy.com/p/71511.html

    上一篇: Rest clients for Java?

    下一篇: based simple python chat program