質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

SOAP

SOAP(Simple Object Access Protocol)はウェブサービス実装においての構造化された情報をやり取りするためのプロトコル規定です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3516閲覧

PHPのSoapClientでのパラメータの指定方法について

poponta

総合スコア12

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

SOAP

SOAP(Simple Object Access Protocol)はウェブサービス実装においての構造化された情報をやり取りするためのプロトコル規定です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/07/13 00:55

APIを経由してシステムにデータを登録したいと思っています。
APIのスキーマは下記のとおりです。(主要部分のみ)

xml

1<complexType name="ConstructionTarget"> 2 <sequence> 3 <element name="hostName" nillable="true" type="soapenc:string"/> 4 <element name="interfaceName" nillable="true" type="soapenc:string"/> 5 <element name="ipAddress" nillable="true" type="soapenc:string"/> 6 <element name="portNumber" nillable="true" type="soapenc:string"/> 7 <element name="slotNumber" nillable="true" type="soapenc:string"/> 8 </sequence> 9</complexType> 10 11<complexType name="ArrayOfConstructionTarget"> 12 <complexContent> 13 <restriction base="soapenc:Array"> 14 <attribute ref="soapenc:arrayType" wsdl:arrayType="impl:ConstructionTarget[]"/> 15 </restriction> 16 </complexContent> 17</complexType> 18 19<complexType name="Construction"> 20 <sequence> 21 <element name="constructionTargets" nillable="true" type="impl:ArrayOfConstructionTarget"/> 22 <element name="constructionType" type="xsd:int"/> 23 <element name="name" nillable="true" type="soapenc:string"/> 24 <element name="startTime" nillable="true" type="xsd:dateTime"/> 25 <element name="endTime" nillable="true" type="xsd:dateTime"/> 26 </sequence> 27</complexType>

これに対して下記のスクリプトでデータを登録しようとしたところ、うまくいきました。

PHP

1<?php 2$cctServer = "xxx.xxx.xxx.xxx:8080"; 3$cctFlow = "/cct/services/Constructions"; 4$cctWSDL = sprintf("http://".$cctServer.$cctFlow."?wsdl"); 5 6$soap_param = array( 7 'Construction' => array( 8 'constructionTargets' => '', 9 'constructionType' => '3', 10 'name' => 'testname1111', 11 'startTime' => '2018-07-06T15:10:00.000Z' 12 'endTime' => '2018-07-06T18:30:00.000Z' 13 ) 14); 15 16try{ 17 $client = new SoapClient($cctWSDL, array('trace' => 1, 'cache_wsdl' => WSDL_CACHE_NONE)); 18 $result = $client->__soapCall("put", $soap_param); 19} catch (Exception $e) { 20 echo $e; 21 die(); 22} 23 24die();

しかし、実際には'constructionTargets'のところは配列になっており、
hostName、interfaceNameなどのデータを配列で指定しなければなりません。

そこで下記のように指定したのですが、うまくいきません。

PHP

1$soap_param = array( 2 'Construction' => array( 3 'ConstructionTarget' => array( 4 'hostName' => 'testhost2222', 5 'interfaceName' => 'intf3333', 6 'ipAddress' => '192.168.1.1', 7 'portNumber' => '7', 8 'slotNumber' => '8' 9 ), 10 'constructionType' => '3', 11 'name' => 'testname1111', 12 'startTime' => '2018-07-06T15:10:00.000Z' 13 'endTime' => '2018-07-06T18:30:00.000Z' 14 ) 15);

'ConstructionTarget'を'constructionTargets'にしてもNGでした。

配列をどのように指定したら、うまくいくのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

'constructionTargets' の下に配置する配列名を指定して、各要素を収容する配列を置けばよかったようです。

PHP

1$soap_param = array( 2 'Construction' => array( 3 'constructionTargets' => array( 4 'ConstructionTarget' => array( 5 'hostName' => 'testhost2222', 6 'interfaceName' => 'intf3333', 7 'ipAddress' => '192.168.1.1', 8 'portNumber' => '7', 9 'slotNumber' => '8' 10 ) 11 ), 12 'constructionType' => '3', 13 'name' => 'testname1111', 14 'startTime' => '2018-07-06T15:10:00.000Z' 15 'endTime' => '2018-07-06T18:30:00.000Z' 16 ) 17);

下記でもうまくいきます。

PHP

1$const_target = array( 2 'ConstructionTarget' => array( 3 'hostName' => 'testhost2222', 4 'interfaceName' => 'intf3333', 5 'ipAddress' => '192.168.1.1', 6 'portNumber' => '7', 7 'slotNumber' => '8' 8 ) 9); 10 11$soap_param = array( 12 'Construction' => array( 13 'constructionTargets' => $const_target, 14 'constructionType' => '3', 15 'name' => 'testname1111', 16 'startTime' => '2018-07-06T15:10:00.000Z' 17 'endTime' => '2018-07-06T18:30:00.000Z' 18 ) 19);

下記のあたりの配列の指定がおかしかったわけですね。

XML

1<complexType name="ArrayOfConstructionTarget"> 2 <complexContent> 3 <restriction base="soapenc:Array"> 4 <attribute ref="soapenc:arrayType" wsdl:arrayType="impl:ConstructionTarget[]"/> 5 </restriction> 6 </complexContent> 7</complexType>

投稿2018/07/31 07:45

編集2018/07/31 07:50
poponta

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問