目标

雅虎 HotJobs 的 Java 客户端 简历搜索 REST API.

背景

我习惯于为 SOAP API 编写 Web 服务客户端,其中 进口 生成代理存根,然后您就可以开始运行了。但这是一个 REST API,对我来说是新的。

细节

进步

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

使用 球衣 (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>  

问题

  • 有没有办法自动生成 POJO 哪些可以在没有正式模式的情况下进行编组/解组?
  • 我是否应该尝试手动生成这些 POJO 联合航空航天局 注释?
  • 是否有一些我应该利用的工具,这样我就不必手动完成所有这些工作?
有帮助吗?

解决方案

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

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


编辑:过去的爆炸,但我看到了评论,重读了问题,发现第一句话很难理解。所以,澄清一下:

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

其他提示

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

或者,如果您非常喜欢 W3C Schema,您当然可以手动编写 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 传递给 XMLStreamReader。这样你就可以传递不同的对象类型来绑定。

最后:发送/接收请求:普通的旧 HttpURLConnection 对于 GET 和 POST 请求可以正常工作(使用 URL.openConnection() 进行构造)。如果需要的话,Jakarta HttpClient 有更多功能。因此,通常您并不真正需要单独的 REST 客户端——它们可能会派上用场,但通常构建在简单的 http 客户端部分上。

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

http://www.ywebb.com/

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top