SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
てるてる動画

【php】SOAPする

問題

SOAPでとあるシステムとやり取りすることになりました。phpでどうやったらよい?

php

答え

1、情報を確認

とりあえずリクエスト先URLを知りたい

例)https://soap.example.jp/soap/NamedResourceService

2、WSDL確認

SOAPの場合WSDLが提供される。URLが不明だったら ~?wsdl を付けてみるとよい。

例)https://soap.example.jp/soap/NamedResourceService?wsdl

3、phpを書く

phpのSOAPを使うとこんな感じ。

<?php

$client  = new SoapClient('https://soap.example.jp/soap/NamedResourceService?wsdl');
//wsdlの内容が変でリクエスト先をあえて指定しないといけない場合
//$client->__setLocation('https://soap.example.jp/soap/NamedResourceService');

$response = $client->呼びたいメソッド名(
	new SoapParam($hoge, "パラメータ名1"),
	new SoapParam($fuga, "パラメータ名2"),
	new SoapParam($piyo, "パラメータ名3")
);

以下のようにすると、文字列として引数を作ってくれるのだが、

new SoapParam($hoge, "パラメータ名")

型を指定したいときはSoapVarで。

$_hoge= 'ごにょごにょ';
$hoge = new SoapVar($_hoge, XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema");
$response = $client->hogeService(new SoapParam($hoge, "パラメータ名1"));

phpのSOAPクライアントに依存しない場合

SOAPのリクエストって、要するにXMLを作ってPOSTなりすればよいので、file_get_contents()でも呼べる。

自力でXMLを作り、自力でリクエストを送信する場合、リクエストのデータの手作りで何らかの問題にはまるかもしれない。生のレスポンスを取得してしまうので、レスポンスの処理が少しだけ手間かもしれない。でも、依存するものが少ないのがメリット。

<?php

$data = '<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://xxxx" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:hogeService><hogeParam xsi:type="xsd:string">パラメータ1</hogeParam></ns1:hogeService></SOAP-ENV:Body></SOAP-ENV:Envelope>';

$options = array(
		'http'=>array(
				'method' => 'POST',
				'header' => "Content-type: application/soap+xml; charset=UTF-8\r\n"
							. "Content-Length: " . strlen($data) . "\r\n"
							. 'SOAPAction: ""',
				'content' => $data
			)
	);
$context = stream_context_create($options);

$response = file_get_contents('https://soap.example.jp/soap/NamedResourceService', false, $context);

関連するメモ

コメント