本題
まず
下記のように記述しましたが404エラーが帰ってきてしまいます。
という悩みであれば,https://www.test.org?wsdl
などとして茶化さずに本物のURLを出すべきです.404 Not Found は,あなたがURLまたはパラメータの一部を間違えていることに起因する可能性が高いです. (また例として用いるドメインには example.com
を用いるべきです)
現時点で明らかにおかしいと言えるのは以下の2点です.
一点目,XML文字列がストリームコンテキストのheader
オプションに指定されています.ここにくるのはContent-Length: XXX
といったHTTPヘッダのみです.XMLのデータが入ることは基本的にあり得ません.(また$header
と$body
も意図に反して入れ替わってしまっているような気がするんですが…)
二点目,XMLの構造がめちゃくちゃです.fagaiさんのリンク先の情報によれば,SOAPリクエストは以下のようなフォーマットをとるはずです.改行区切りで後ろに続いているほうがPOSTされるXMLとなりますが,提示されているXMLはこの形式に従っているように見えません.
http
1POST /MySERVER/myWSDLservice.asmx HTTP/1.1
2 connection.mywebsite.com
3 text/xml; charset=utf-8
4Content-Length: length
5SOAPAction: "http://connection.mywebsite.com/MySERVER/GetCarType"
6
7<?xml version="1.0" encoding="utf-8"?>
8<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
9 <soap:Body>
10 <GetCarType xmlns="http://connection.mywebsite.com/MySERVER/">
11 <IDNumber>string</IDNumber>
12 </GetCarType>
13 </soap:Body>
14</soap:Envelope>
蛇足
この用途では SoapClient
が一番使いやすいと思うんですが…
XMLを書かずに,あたかも普通のPHPのコードを書いているような気分で書けますよ.
php
1<?php
2try {
3
4 $client = @new \SoapClient('https://example.com/?wsdl');
5 if (!$client) {
6 $error = error_get_last();
7 throw new \Exception($error['message']);
8 }
9 $result = $client->doSomethingAction(
10 'Hello', // (type: "string"; name: "param0")
11 'World', // (type: "string"; name: "param1")
12 new \SoapVar('2016-03-07', XSD_DATE) // (type: "date"; name: "param2")
13 new \SoapParam(
14 new \SoapVar('2015-12-25', XSD_DATE), // (type: "date")
15 "christmas" // (name: "christmas")
16 )
17 );
18 var_dump($result);
19
20} catch (\Exception $e) {
21
22 var_dump($e->getMessage());
23
24}
cURLのCURLOPT_SSL_VERIFYPEER
についての補足画像
(Noriyuki_sasaさんの回答へのコメント参照)
今回はHTTP通信は成功している(少なくとも404というHTTPステータスは返ってきている)ので,TLSが原因のエラーではありません.TLSでエラーが起こった場合,HTTPステータスすら取得出来ません.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。