代码之家  ›  专栏  ›  技术社区  ›  Chase Seibert

没有模式的Java REST客户端

  •  10
  • Chase Seibert  · 技术社区  · 15 年前

    目标

    Java客户端为雅虎的热门工作 Resumé Search REST API .

    背景

    我习惯于为SOAP API编写Web服务客户机,其中 wsimport 生成代理存根,然后关闭并运行。但这是一个RESTAPI,对我来说是新的。

    细节

    进展

    我看了这个问题 Rest clients for Java? 但是,那里的自动化解决方案假定您同时提供服务器和客户机,在POJO上调用JAXB来生成模式和RESTAPI。

    使用 Jersey (A) JAX-RS 实现),我已经能够发出手动HTTP请求:

    import com.sun.jersey.api.client.*;
    
    ...
    
    ClientConfig clientConfig = new DefaultClientConfig();
    Client client = Client.create(clientConfig);
    
    WebResource webResource = client.resource("https://hj.yahooapis.com/v1/HJAuthTokens");
    webResource.accept("application/xml");
    
    // body is a hard-coded string, with replacements for the variable bits
    String response = webResource.post(String.class, body);
    
    // parse response into a org.w3c.dom.Document
    // interface with Document via XPATH, or write my own POJO mappings
    

    回答可能如下:

    <?xml version="1.0" encoding="utf-8"?>   
    <Response>   
        <ResponseCode>0</ResponseCode>   
        <ResponseMessage>Login successful</ResponseMessage>
        <Token>NTlEMTdFNjk3Qjg4NUJBNDA3MkJFOTI3NzJEMTdDNDU7bG9jYWxob3N0LmVnbGJwLmNvcnAueWFob28uY29tO0pVNWpzRGRhN3VhSS4yQVRqRi4wWE5jTWl0RHVVYzQyX3luYWd1TjIxaGx6U0lhTXN3LS07NjY2MzM1OzIzNDY3NTsxMjA5MDE2OTE5OzZCM1RBMVNudHdLbl9VdFFKMFEydWctLQ==</Token>   
    </Response>  
    

    或者,它看起来像:

    <?xml version="1.0" encoding="utf-8"?>   
    <yahoo:error xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" xml:lang="en-US">   
        <yahoo:description>description</yahoo:description>   
        <yahoo:detail>   
            <ErrorCode>errorCode</ErrorCode>   
        </yahoo:detail>   
    </yahoo:error>  
    

    问题

    • 有自动生成的方法吗 POJOs 哪一个可以在没有正式模式的情况下进行编组/解编?
    • 我应该试着用手工生成这些pojos吗? JAXB 注释?
    • 我是否应该利用一些工具,这样我就不必手动完成所有这些工作?
    4 回复  |  直到 10 年前
        1
  •  3
  •   kdgregory    15 年前

    有趣的是,它们提供了一个HTTP URL作为模式的名称空间URI,但实际上并没有将其模式保存在那里。这可能是他们的疏忽,一封电子邮件或讨论列表的发布可以纠正这一点。

    一种方法是创建您自己的模式,但这似乎是一个小回报的大量工作。考虑到这些信息有多简单,我想知道您是否需要一个POJO来包装它们?为什么不让一个处理程序用xpath提取您需要的数据呢?


    编辑:爆炸过去,但我看到评论,重读问题,并意识到第一句很难理解。因此,澄清:

    如果您要编写一个公共可访问的Web服务,一个非常好的习惯就是让您的模式文档在用于模式命名空间URI的同一个URL上可用——或者更好的做法是,让该URL成为完整文档的链接(W3C XSD命名空间本身就是一个很好的示例: http://www.w3.org/2001/XMLSchema )

        2
  •  3
  •   Christian    14 年前

    我建议用手写bean,如果必须的话,只能用jaxb注释来注释。对于大多数访问器/变元器(getter/setter),您不必这样做;默认情况下,会考虑所有公共bean访问器和字段,使用bean约定派生名称,默认情况下使用元素而不是属性(因此需要对属性进行注释)。

    当然,如果您非常喜欢W3C模式,也可以手工编写模式,使用JAXB生成bean。只需使用结果代码(而不是模式)进行数据绑定。

    波乔:那很简单。类似:

    @XmlRootElement("Response")
    class Response {
      public int responseCode;
      public String responseMessage;
      public String token; // or perhaps byte[] works for automated base64?
    }
    

    其他的也一样。或者,如果你喜欢的话,使用getter/setter,不要介意更冗长一点。这些只是数据容器,不需要太花哨。

    如果必须从内容自动检测类型,请考虑使用stax解析器来查看根元素,然后使用jaxb unmarshaller绑定,将指向该根元素的xmlstreamreader交给它。这样就可以传递要绑定到的不同对象类型。

    最后:发送/接收请求:对于GET和POST请求,普通的旧httpurlconnection可以正常工作(使用,比如url.openconnection()构造)。如果需要,雅加达httpclient有更多的功能。因此,通常您不需要单独的REST客户机——它们可能很方便,但通常构建在简单的HTTP客户机部件上。

        3
  •  1
  •   Dave    12 年前

    我发现http4e对于拨打休息电话非常有用。它是一个很棒的Eclipse插件,它有标签、语法着色、自动建议、代码生成、RESTHTTP调用重播等。它在HTTP调试、HTTP篡改、黑客攻击方面做得很好。我玩得很开心。

    http://www.ywebb.com/

        4
  •  0
  •   yegor256    10 年前

    尝试 JdkRequest jcabi-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