私はSOAPエンドポイントを持っており、リクエストを送信するためにPHPの\ SoapClientクラスを使用したいと思います。問題はたとえ "senderAddress"属性がたとえあったとしても。 "name"、 "nameDetail"、 "type"属性(それらのうちのいくつかはドキュメントによって必要とされます)の場合、生成されたXML要求にはそれらが含まれません。それが受け入れ/生成する唯一の属性は "id"属性です。SoapClientが正しいリクエストを生成しない
同様の問題は、貨物オブジェクトの他の部分にも同じ問題があります。 Pickupパートは "date"属性だけを設定でき、他のすべてはスキップ/無視されます。
私は、データオブジェクトずに、いくつかのダミーコードの下だけの単純な配列を用意しました:
<?php
$soapClient = new \SoapClient("https://capi.dpdportal.sk/apix/shipment/?wsdl", [
'trace' => 1
]);
$headers = array();
$dpdSecurity = new \stdClass();
$token = new \stdClass();
$token->ClientKey = "topsecretkey";
$token->Email = "topsecretmail";
$dpdSecurity->SecurityToken = $token;
$headers["auth"] = new \SoapHeader('http://www.dpdportal.sk/XMLSchema/DPDSecurity/v2', 'DPDSecurity', $dpdSecurity);
$soapClient->__setSoapHeaders($headers);
$shipment = [
"reference" => "123",
"delisId" => "123",
"addressSender" => [
"type" => "b2c", // this attribute is missing in the Request
"id" => 41656415651,
"nameDetail" => "test", // this attribute is missing in the Request
],
"addressRecipient" => "123",
"product" => 9,
"parcels" => [],
"pickup" => null,
];
$params = [
'shipment' => $shipment,
];
try {
$response = $soapClient->CreateV1($params);
echo '==' . PHP_EOL;
var_dump($response);
} catch (\Exception $e) {
echo $e->getMessage();
}
生成された要求:addressSender
要素はタイプSHIPMENT:addressEnvelope
であること
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.dpdportal.sk/XMLSchema/SHIPMENT/v1" xmlns:ns2="http://www.dpdportal.sk/XMLSchema/DPDSecurity/v2">
<SOAP-ENV:Header>
<ns2:DPDSecurity>
<ns2:SecurityToken>
<ns2:ClientKey>topsecretkey</ns2:ClientKey>
<ns2:Email>topsecretmail</ns2:Email>
</ns2:SecurityToken>
</ns2:DPDSecurity>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:CreateRequest>
<ns1:shipment>
<ns1:reference>123</ns1:reference>
<ns1:delisId>123</ns1:delisId>
<ns1:product>9</ns1:product>
<ns1:pickup />
<ns1:addressSender>
<ns1:id>41656415651</ns1:id>
</ns1:addressSender>
<ns1:addressRecipient />
<ns1:parcels />
</ns1:shipment>
</ns1:CreateRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
私はこの質問には言及していませんが、2番目のシーケンスからすべての属性を定義しても、結果に出現する要素 "id"だけがあります。 idを持つサービスの場合、addressSender要素は空になります。 – JCZ
実際には、最初のシーケンスにはオプションのidだけが含まれているため、空になります。したがって、常に有効なので、SoapClientは常に最初のシーケンスを選択すると思います。自分でコードをテストしたところ、 'ShipmentSchema_v1.xsd'の' id'要素の 'minOccurs'を' 1'に変更するだけで動作させることができました。 'SoapClient'をインスタンス化するときは、wsdlファイルとxsdファイルの両方をローカルにホストし、ローカルwsdlファイルを指す必要があります。 – Pieter
あなたの '' addressRecipient "=>" 123 "'は無効です。それを動作させるには、 '' addressRecipient "=> [" id "=> 123]に変更する必要があります。 – Pieter