无模式的Java REST客户端 目标

无模式的Java REST客户端 目标,java,xml,jaxb,jax-rs,Java,Xml,Jaxb,Jax Rs,雅虎热作业的Java客户端 背景 我习惯于为soapis编写web服务客户端,在那里生成代理存根,然后您就可以开始运行了。但这是一个RESTAPI,对我来说是新的 细节 原料药 没有 没有正式的XML模式(XSD或DTD文件)。有 没有提供示例代码 进展 我研究了这个问题,但自动化解决方案假设您同时提供服务器和客户机,并在POJO上调用JAXB来生成模式和RESTAPI 使用(一个实现),我已经能够手动发出HTTP请求: import com.sun.jersey.api.client.*;

雅虎热作业的Java客户端

背景 我习惯于为soapis编写web服务客户端,在那里生成代理存根,然后您就可以开始运行了。但这是一个RESTAPI,对我来说是新的

细节
  • 原料药
  • 没有
  • 没有正式的XML模式(XSD或DTD文件)。有
  • 没有提供示例代码
进展 我研究了这个问题,但自动化解决方案假设您同时提供服务器和客户机,并在POJO上调用JAXB来生成模式和RESTAPI

使用(一个实现),我已经能够手动发出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
登录成功
NTLEMTDFNJK3QJG4NUJBNDA3MKJFOTI3NZJEMTDDNDU7BG9JYWxOb3N0LMVNBGJWLMNVCNAUEWFOB28UY29TO0PVNWPZRGRHn3VHSS4YQVRQRI4WWE5JTWL0RHVYZQYX3LUYWD1TJIXAGX6U0LHTXN3Ls07NJY2MZM1ZZZZNd3Nd3NtsXmJA5MDE5OZZCMM1MVNUDHBL9VDFFKMFYDWCTLQ==
或者,它可以看起来像:

<?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
  • 是否有一些工具可以让我不用手动完成所有这些工作?

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

一种方法是创建您自己的模式,但这似乎需要做大量的工作以获得很少的回报。考虑到这些消息是多么简单,我想知道你是否需要一个POJO来包装它们?为什么不使用XPath来提取所需数据的处理程序呢


编辑:从过去开始,但我看到了评论,重新阅读了问题,意识到第一句很难理解。因此,澄清:


如果您要编写一个可公开访问的web服务,有一个非常好的习惯,那就是在模式名称空间URI使用的相同URL上提供模式文档——或者更好,将该URL作为完整文档的链接(W3C XSD名称空间本身就是一个很好的示例:)。

我建议手动编写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,并且不介意更详细一点,那么可以使用getter/setter。这些只是数据容器,不需要太花哨

如果您必须自动从内容中检测类型,请考虑使用StAX解析器来查看根元素,然后使用JAXB unMsHARLER绑定,并将XMLStaveRead指向该根元素。这样,您就可以传递不同的对象类型进行绑定


最后:发送/接收请求:对于GET和POST请求,普通的HttpURLConnection可以正常工作(比如说,使用URL.openConnection()构造)。雅加达HttpClient有更多的功能,如果需要的话。因此,通常情况下,您并不真正需要单独的REST客户机——它们可能很方便,但通常构建在简单的http客户机上。

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


试试(我是一名开发人员)的
JdkRequest
from。这就是它的工作原理:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

查看此博客文章了解更多详细信息:

我正在编写他们的API支持,以查看是否确实存在架构。XPath看起来只是一个脆弱的解决方案;我如何知道我的XPath不会处理新的XML数据包?如果不知道新元素是什么,不管技术如何,您将如何处理它们?如果您假定某个版本是健全的(即,他们将构建数据以实现合理的兼容性,因为您的XPath仍然可以工作),那么这怎么解决不了问题呢?我最终使用XMLSpy从示例数据包生成了一个模式,然后我为使用JAXB的数据包生成了映射。有几次我不得不向示例数据包中添加新的模式,然后重新生成模式和JAXB绑定。