2

我有一个在 XML 发布请求方面运行良好的 api。XML 在 Post 正文中接收并进行相应处理。这是方法的标题

@POST
@Path ("{"+num+"}/"+STATUS+"."+XML)
@Consumes (MediaType.APPLICATION_XML)
@Produces (MediaType.APPLICATION_XML)
public Response getStatusXML (@PathParam(num) String num,
        JAXBElement<OrderStatusRequestType> jaxbOrderStatusRequestType,
        @Context UriInfo requestUriInfo,
        @Context SecurityContext securityContext){

    OrderStatusRequestType orderStatusRequestType = jaxbOrderStatusRequestType.getValue();

    return processRequest (num, XML, orderStatusRequestType, securityContext);
}

使用此 POST 正文调用此 WS

<orderStatusRequest>
    <vendor>32658</vendor>
    <key>232X1</key>
</orderStatusRequest>

我有 XML 模式,这个请求按要求工作正常。我得到了 jaxbObject,也得到了 orderStatusRequest。但是,当我尝试调用我的 json webservice 时,我得到了 null orderStatusRequest。我有一个单独的方法来使用 json。

@POST
@Path ("{"+num+"}/"+STATUS+"."+JSON)
@Consumes (MediaType.APPLICATION_JSON)
@Produces (MediaType.APPLICATION_JSON)
public Response getStatusJSON(@PathParam(num) String num,
        JAXBElement<OrderStatusRequestType> jaxbOrderStatusRequestType,
        @Context UriInfo requestUriInfo,
        @Context SecurityContext securityContext){
    OrderStatusRequestType orderStatusRequestType= jaxbOrderStatusRequestType.getValue();

    return processRequest (num, JSON, orderStatusRequestType, securityContext);
}

我在 post 请求中发送以下 json

{"orderStatusRequest":{"vendor":"32658","key":"232X1"}}

我在我的 jaxbElement 中得到空对象。我无法理解为什么。为方便起见,这是我的 XML Schema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:complexType name="orderStatusRequestType">
        <xs:sequence>
            <xs:element name="vendor" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="key" type="xs:string" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

            <xs:element name="orderStatusRequest" type="orderStatusRequestType"/>


</xs:schema>

我写了一个客户端并发送 JSON 请求

    ClientResponse clientResponse = service.path("api")
    .path("v1")
    .path("personal")
    .path("orders")
    .path(num)
    .path("status.json").accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, jaxbOst);

它给了我错误状态 415,即不支持内容类型。但是,只有 2 处修改即status.xml可以MediaType.APPLICATION_XML正常工作。


更新 2:使用 Fiddler,我可以使用 JSON 访问 Web 服务。但是泽西岛并没有将输入的 POST 正文行进到特定的对象中。我在vendorkey字段中得到空值。


更新 3 我可以使用 Fiddler 的 JSON。JSON 是{"vendor":"32658","key":"232X1"}. 我之前将它包裹在另一个对象下。我仍然无法使用 Jersey Client 发送请求。我猜是XML当我尝试发布时我的 JAXB 对象正在给出。我如何确保当我使用它时objectFactory.createOderRequestStatus,它会被翻译成 JSON 而不是 XML?

4

1 回答 1

1

415 表示您的客户端未在请求中发送正确的内容类型。如果您查看您的路径,对于 XML 和 JSON 方法,它们是相同的,因此您需要确保您的客户端发送正确的内容路径,以便区分哪种方法将为您的请求提供服务。否则泽西岛只会选择第一个,这就是这里发生的事情。

在另一个线程中有关于这个主题的讨论。我自己没有尝试过,但是您可以向您的客户添加一些标头以查看是否有效吗?也许类似于以下内容:

ClientResponse clientResponse = service.path("api")
                                .path("v1")
                                .path("personal")
                                .path("orders")
                                .path(num)
                                .path("status.json")
                                .accept(MediaType.APPLICATION_JSON)
                                .header("content-type", MediaType.APPLICATION_JSON)
                                .post(ClientResponse.class, jaxbOst);
于 2012-09-19T02:09:15.683 回答