2

XMLPOSTリクエストに関しては正常に機能している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);
}

このWSは、このPOST本体で呼び出されます

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

そのためのXMLスキーマがあり、この要求は要件に従って正常に機能しています。jaxbObjectを取得し、orderStatusRequestも取得します。ただし、json Webサービスを呼び出そうとすると、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);
}

ポストリクエストで次のjsonを送信しています

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

jaxbElementでnullオブジェクトを取得します..理由がわかりません。便宜上、これが私のXMLスキーマです

<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サービスにアクセスできます。しかし、Jerseyは入力POST本文を特定のオブジェクトにマーチしていません。vendorkeyフィールドでnullを取得しています。


更新3Fiddler からJSONを使用できます。JSONは{"vendor":"32658","key":"232X1"}です。以前、別のオブジェクトの下にラップしていました。しかし、 JerseyClientを使用してリクエストを送信することはできません。私が推測しているのは、XML投稿しようとしたときにJAXBオブジェクトが提供しているということです。objectFactory.createOderRequestStatusを使用するときに、XMLではなくJSONに変換されることを確認するにはどうすればよいですか?

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 に答える