10

目标

雅虎 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>  

问题

  • 有没有办法自动生成可以在没有正式模式的情况下编组/解组的POJO ?
  • 我是否应该尝试使用JAXB注释手动生成这些 POJO?
  • 是否有一些我应该利用的工具,所以我不必手动完成所有这些操作?
4

4 回答 4

3

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

一种方法是创建您自己的模式,但这似乎需要做很多工作却收效甚微。鉴于消息是如此简单,我想知道您是否甚至需要一个 POJO 来包装它们?为什么不使用 XPath 提取所需数据的处理程序呢?


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

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

于 2008-12-11T15:32:02.270 回答
3

我建议手工编写 bean,并且仅在必要时使用 JAXB 注释进行注释。对于大多数访问器/突变器(getter/setter),您不必这样做;默认情况下,所有公共 bean 访问器和字段都被考虑,名称是使用 bean 约定派生的,默认是使用元素而不是属性(因此需要对属性进行注释)。

或者,如果您非常喜欢 W3C Schema,您当然可以手动编写模式,使用 JAXB 生成 bean。并且只需使用生成的代码而不是模式来进行数据绑定。

至于 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() 构建)。如果需要,Jakarta HttpClient 具有更多功能。因此,您通常并不需要单独的 REST 客户端——它们可能会派上用场,但通常构建在简单的 http 客户端部分之上。

于 2009-02-28T00:59:01.767 回答
1

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

http://www.ywebb.com/

于 2009-06-15T00:49:36.830 回答
0

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

于 2014-06-29T08:14:25.013 回答