Xml 客户机如何知道REST中对象的正确结构?
我在RESTEasy中使用Java和JBoss7。我已经创建了我的RESTful服务和一个客户端来测试我的服务:Xml 客户机如何知道REST中对象的正确结构?,xml,rest,jax-rs,Xml,Rest,Jax Rs,我在RESTEasy中使用Java和JBoss7。我已经创建了我的RESTful服务和一个客户端来测试我的服务: ClientRequest request = new ClientRequest( "http://localhost:8080/test/rest/cars"); request.accept(MediaType.APPLICATION_XML); String input = "<car><carId>10.99</carId&
ClientRequest request = new ClientRequest(
"http://localhost:8080/test/rest/cars");
request.accept(MediaType.APPLICATION_XML);
String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";
request.body(MediaType.APPLICATION_XML, input);
ClientResponse<String> response = request.post(String.class);
System.out.println("Output from Server .... \n");
System.out.println(response.getStatus());
ClientRequest=newclientrequest(
"http://localhost:8080/test/rest/cars");
accept(MediaType.APPLICATION\uxml);
字符串输入=“10.99Ford”;
主体(MediaType.APPLICATION_XML,输入);
ClientResponse-response=request.post(String.class);
System.out.println(“从服务器输出…”\n);
System.out.println(response.getStatus());
这很好用!这里唯一的问题是客户端。我必须发送硬编码的XML,就像您在String input=“10.99Ford”中看到的那样代码>因为客户端没有我拥有的对象
客户机将模拟从get方法接收到的XML表示,这在处理大型复杂资源时可能很困难
- 有没有一种方法可以让客户机知道他们想要发送的对象的正确结构,或者他们必须发送类型化的XML
- 我可以给客户机一些类似于WSDL或XSD的东西,或者是一些不受REST约束的东西吗
- 我见过一些解决方案,其中人们会使用Xsteam和解组,但他们假设客户机具有资源的类表示
不要在客户端代码中硬编码XML消息。XML是在服务和客户机之间传递的内容
让我们假设这样一种情况:您在不同的位置公开了相同的服务,其中一个只理解XML格式,而另一个只理解JSON。如果要将客户端与硬编码消息一起使用,则只能调用使用XML的服务。记住,REST是关于资源表示的
因为客户端没有我拥有的对象。客户机将模拟他从get方法接收到的XML表示,这对于大型复杂的资源来说是很难做到的
有没有一种方法可以让客户机知道他们想要发送的对象的正确结构,或者他们必须发送类型化的XML
假设您的客户机是一个Java应用程序,它通常与对象一起工作。这些对象表示资源(例如,car
),这就是您的客户机在内部使用的资源
调用服务时,只需将这些对象封送到XML。当服务响应时,您将XML解组为对象
根据使用的Accept
和Content-Type
标题,只需选择适当的封送器/解封器即可。然后,您甚至可以将某些内容作为XML发送,并将其作为JSON接收回来
当然,可以使用与服务端相同的注释,甚至可以在服务和客户端之间重用一些java类型(类),但是当客户端用其他技术编写时,那些java类就变得无用:C++、Python、C++等。
为什么客户机应该关心服务使用的类型?它应该只关心陈述。在内部,客户机可以使用它想要的任何类型(独立于服务),并且在与服务对话时只需与适当的表示进行通信
我可以给客户机一些类似于WSDL或xsd的东西,或者是一些不受REST约束的东西吗
这有点棘手
REST是一种用于构建分布式系统的软件体系结构样式。不幸的是,不同的人对这种“风格”的理解不同,因此存在大量所谓的RESTful API,它们简单地描述了使用什么方法、在什么URL上以及在转发时发送什么“类型”
正如罗伊·T·菲尔丁本人所强调的那样,这是一种错误的休息方式
RESTful客户机不需要事先知道要访问哪些URL或使用哪些“类型”进行通信。了解exchange中使用的媒体类型是它所需要的(我不是说application/xml
,它只说明消息的格式,而没有语义或内部内容的描述)
因此,为什么服务应该提供WSDL?事实上(尽管WSDL2.0可以描述RESTful服务),它实际上是我们正在讨论的一个问题。但是其他社区实际上还没有对WADL下定决心,所以这也是
如果你是在“按部就班”休息,那么就不需要WADL了。如果您实际上只有一个基于HTTP的接口,我假设您可以提供一个WADL,以方便其他程序员在开发客户机时的工作
我见过一些解决方案,其中人们会使用Xsteam和解组,但他们假设客户机具有资源的类表示
RESTeasy支持JAXB编组,因此不需要太多努力。不要在客户端代码中硬编码XML消息。XML是在服务和客户机之间传递的内容
让我们假设这样一种情况:您在不同的位置公开了相同的服务,其中一个只理解XML格式,而另一个只理解JSON。如果要将客户端与硬编码消息一起使用,则只能调用使用XML的服务。记住,REST是关于资源表示的
因为客户端没有我拥有的对象。客户机将模拟他从get方法接收到的XML表示,这对于大型复杂的资源来说是很难做到的
有没有一种方法可以让客户机知道他们想要发送的对象的正确结构,或者他们必须发送类型化的XML
假设您的客户机是一个Java应用程序,它通常与对象一起工作。这些对象表示资源(例如,car
),这就是您的客户机在内部使用的资源
什么时候打电话给se