没有架构的Java REST客户端

时间:2008-12-11 15:15:15

标签: java xml jaxb jax-rs

目标

Yahoo的HotJobs Resumé Search REST API的Java客户端。

背景

我习惯为SOAP API编写Web服务客户端,其中wsimport生成代理存根,并且您已经关闭并运行。但这是一个REST API,对我来说是新的。

详细

进度

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

使用JerseyJAX-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,可以在没有正式架构的情况下编组/解组?
  • 我是否应该尝试使用JAXB注释手动生成这些POJO?
  • 是否有一些我应该利用的工具,所以我不必手动完成所有这些工作?

4 个答案:

答案 0 :(得分:3)

我建议手工编写bean,如果必须,只使用JAXB注释进行注释。对于大多数访问者/变异者(getter / setters)你不必;默认情况下,所有公共bean访问器和字段都被考虑,name是使用bean约定派生的,而default是使用元素而不是属性(因此需要对属性进行注释)。

或者你可以手动编写模式,使用JAXB生成bean,如果你喜欢W3C Schema的话。只需使用结果代码而不是模式来进行数据绑定。

关于POJO:这可以很简单。类似的东西:

@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指向该根元素。这样你就可以传递不同的对象类型来绑定。

最后:发送/接收请求:普通的旧HttpURLConnection适用于GET和POST请求(使用URL.openConnection()构造)。如果需要,雅加达HttpClient有更多功能。因此,您通常不需要单独的REST客户端 - 它们可能会派上用场,但通常建立在简单的http客户端部件上。

答案 1 :(得分:3)

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

一种方法是创建自己的架构,但这似乎很多工作几乎没有回报。鉴于消息有多简单,我想知道你是否需要一个POJO来包装它们?为什么不只是有一个处理程序,使用XPath提取您需要的数据?


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

如果您要编写可公开访问的Web服务,一个非常好的习惯是使您的架构文档可以在用于架构名称空间URI的相同URL处获得 - 或者更好,使该URL成为链接到完整的文档(W3C XSD命名空间本身就是一个很好的例子:http://www.w3.org/2001/XMLSchema)。

答案 2 :(得分:1)

我发现HTTP4E对于进行REST调用非常有用。它是一个很棒的Eclipse插件,它有标签,语法着色,自动建议,代码生成,REST HTTP调用重放等。它在HTTP调试,HTTP篡改,黑客攻击方面做得很好。我玩得很开心。

http://www.ywebb.com/

答案 3 :(得分:0)

jcabi-http尝试JdkRequest(我是开发人员)。这是它的工作原理:

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

豫ICP备18024241号-1