Yahoo的HotJobs Resumé Search REST API的Java客户端。
我习惯为SOAP API编写Web服务客户端,其中wsimport生成代理存根,并且您已经关闭并运行。但这是一个REST API,对我来说是新的。
我查看了问题Rest clients for Java?,但是那里的自动化解决方案假设您同时提供服务器和客户端,并在POJO上调用JAXB来生成模式和REST API。
使用Jersey(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>
答案 0 :(得分:3)
有趣的是,它们提供了一个HTTP URL作为模式的名称空间URI,但实际上并没有将它们的模式保存在那里。这可能是他们的疏忽,电子邮件或讨论列表发布可以纠正。
一种方法是创建自己的架构,但这似乎很多工作几乎没有回报。鉴于消息有多简单,我想知道你是否需要一个POJO来包装它们?为什么不只是有一个处理程序,使用XPath提取您需要的数据?
编辑:从过去爆炸,但我看到了评论,重读了问题,并意识到第一句很难理解。所以,澄清:
如果您要编写可公开访问的Web服务,一个非常好的习惯是使您的架构文档可以在用于架构名称空间URI的相同URL处获得 - 或者更好,使该URL成为链接到完整的文档(W3C XSD命名空间本身就是一个很好的例子:http://www.w3.org/2001/XMLSchema)。
答案 1 :(得分: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客户端部件上。
答案 2 :(得分:1)
我发现HTTP4E对于进行REST调用非常有用。它是一个很棒的Eclipse插件,它有标签,语法着色,自动建议,代码生成,REST HTTP调用重放等。它在HTTP调试,HTTP篡改,黑客攻击方面做得很好。我玩得很开心。
答案 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