Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 客户机如何知道REST中对象的正确结构?_Xml_Rest_Jax Rs - Fatal编程技术网

Xml 客户机如何知道REST中对象的正确结构?

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&

我在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><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