无模式的Java REST客户端 目标
雅虎热作业的Java客户端 背景 我习惯于为soapis编写web服务客户端,在那里生成代理存根,然后您就可以开始运行了。但这是一个RESTAPI,对我来说是新的 细节无模式的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.*;
- 原料药
- 没有
- 没有正式的XML模式(XSD或DTD文件)。有
- 没有提供示例代码
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
- 是否有一些工具可以让我不用手动完成所有这些工作?
编辑:从过去开始,但我看到了评论,重新阅读了问题,意识到第一句很难理解。因此,澄清:
如果您要编写一个可公开访问的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绑定。