IBM MobileFirst 7.0 では、ローカル Web サーバーで実行されている WSDL を MobileFirst Platform Studio にポイントすることで、SOAP アダプターを作成しました。JSON を XML に変換する SOAP アダプターを呼び出すと、応答が XML から JSON に戻されたときに、数値 (整数、10 進数) とブール値が文字列として返される JSON に設定されます。つまり、応答内でそれらを二重引用符で囲みます。それらを引用符で囲まないままにする代わりに。MFP Studio によって自動生成されたアダプターは何も変更していません。JSONでは、ブール値と数値、およびnullが引用されていないことを理解しています。WebServiceGatewaySupport
また、同じ SOAP サービスを呼び出すために使用する Spring Boot 経由で実行されている非 MobileFirst Web サーバーもあり、@ResponseBody
JSON を自動的に返すように注釈を追加し、数値とブール値は返される文字列内で二重引用符で囲まれていません。
String
MobileFirst/Worklight がすべてをJSON 本体内のとして返すことは想定されていますか? もしそうなら、なぜですか?そうでない場合、これが起こらないようにするために何をする必要があり、数字とブール値を引用符で囲まないままにするかについてのアイデアはありますか?
以下は、Worklight SOAP アダプターとの間の WSDL および JSON 要求/応答の関連部分です。
<xs:element name="customerFoodOrderRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="customerId" type="xs:int"/>
<xs:element name="dateTime" type="xs:dateTime"/>
<xs:element name="item" type="xs:string"/>
<xs:element name="amount" type="tns:money"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="money">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="customerFoodOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="success" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getRecentFoodOrdersForCustomerRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="customerId" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getRecentFoodOrdersForCustomerResponse">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:element name="foodOrders" type="tns:foodOrder"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="foodOrder">
<xs:sequence>
<xs:element name="dateTime" type="xs:dateTime"/>
<xs:element name="item" type="xs:string"/>
<xs:element name="amount" type="tns:money"/>
</xs:sequence>
</xs:complexType>
JSON 応答 #1 (amount
という名前の SimpleType にラップされた xs:decimalmoney
ですが、文字列として JSON に出力されています)
{
"Envelope": {
"Body": {
"getRecentFoodOrdersForCustomerResponse": {
"foodOrders": {
"amount": "10",
"dateTime": "2015-02-14T12:00:00.123-07:00",
"item": "MyItem"
},
"ns2": "http:\/\/company.com\/demo\/demo-producing-web-service"
}
},
"Header": "",
"SOAP-ENV": "http:\/\/schemas.xmlsoap.org\/soap\/envelope\/"
},
"errors": [
],
"info": [
],
"isSuccessful": true,
"responseHeaders": {
"Accept": "text\/xml, text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2",
"Content-Length": "444",
"Content-Type": "text\/xml;charset=utf-8",
"Date": "Wed, 20 May 2015 02:58:26 GMT",
"SOAPAction": "\"\"",
"Server": "Apache-Coyote\/1.1"
},
"responseTime": 328,
"statusCode": 200,
"statusReason": "OK",
"totalTime": 359,
"warnings": [
]
}
二重引用符で囲まれたブール値を持つ JSON 応答 #2 success
:
{
"Envelope": {
"Body": {
"customerFoodOrderResponse": {
"ns2": "http:\/\/company.com\/demo\/demo-producing-web-service",
"success": "true"
}
},
"Header": "",
"SOAP-ENV": "http:\/\/schemas.xmlsoap.org\/soap\/envelope\/"
},
"errors": [
],
"info": [
],
"isSuccessful": true,
"responseHeaders": {
"Accept": "text\/xml, text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2",
"Content-Length": "304",
"Content-Type": "text\/xml;charset=utf-8",
"Date": "Wed, 20 May 2015 02:46:02 GMT",
"SOAPAction": "\"\"",
"Server": "Apache-Coyote\/1.1"
},
"responseTime": 764,
"statusCode": 200,
"statusReason": "OK",
"totalTime": 796,
"warnings": [
]
}
JSON 応答 #3 (xs:int として定義されているにもかかわらず、顧客 ID が二重引用符で囲まれています)
"customer": {
"accountNumber": "11127174",
"firstName": "JOHN",
"id": "200",
"lastName": "DOE",
"status": "None"
},
WSDL からの顧客定義
<xs:complexType name="customer">
<xs:sequence>
<xs:element name="id" type="xs:int"/>
<xs:element minOccurs="1" name="firstName" nillable="false" type="xs:string"/>
<xs:element minOccurs="1" name="lastName" nillable="false" type="xs:string"/>
<xs:element minOccurs="1" name="status" nillable="false" type="tns:status"/>
<xs:element name="accountNumber" type="xs:string"/>
</xs:sequence>
</xs:complexType>