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

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

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

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

Q&A

解決済

4回答

6127閲覧

file_get_contentsでsoap通信をしたい

m.a.684351

総合スコア18

PHP

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

0グッド

1クリップ

投稿2016/03/07 09:50

###PHPでfile_get_contentsを使ってsoap通信をしなければなりません
下記のように記述しましたが404エラーが帰ってきてしまいます。
どうすれば正常に通信できるでしょうか?

php

1const REQUEST_URL = "https://www.test.org?wsdl"; 2$header = "<?xml version='1.0' encoding='UTF-8'?><head><id>abc123456</id><password>1234</password></head>"; 3$body = "<?xml version='1.0' encoding='UTF-8'?><root><testRequest>test</testRequest><testRequest2>test2</testRequest2><version>2.00</version></root>" 4 5$post_data1 = array('xml' => $header); 6$post_data2 = array('xml' => $body); 7 8$stream_options = array( 9 'http' => array( 10 'method' => 'POST', 11 'header' => http_build_query($post_data2), 12 'content' => http_build_query($post_data1))); 13 14$context = stream_context_create($stream_options); 15$response = file_get_contents(REQUEST_URL, null, $context); 16

phpのバージョンは5.3系です

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

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

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

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

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

guest

回答4

0

ベストアンサー

本題

まず

下記のように記述しましたが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 2Host: connection.mywebsite.com 3Content-Type: 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さんの回答へのコメント参照)

Chrome

今回はHTTP通信は成功している(少なくとも404というHTTPステータスは返ってきている)ので,TLSが原因のエラーではありません.TLSでエラーが起こった場合,HTTPステータスすら取得出来ません.

投稿2016/03/07 14:27

編集2016/03/07 20:27
mpyw

総合スコア5223

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

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

0

下のメソッドでどうですか。

PHP

1function curl_get_contents( $url, $timeout = 60 ){ 2 $ch = curl_init(); 3 curl_setopt( $ch, CURLOPT_URL, $url ); 4 curl_setopt( $ch, CURLOPT_HEADER, false ); 5 curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 6 curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout ); 7 curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false); 8 $result = curl_exec( $ch ); 9 curl_close( $ch ); 10 return $result; 11}

投稿2016/03/07 12:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mpyw

2016/03/07 15:09 編集

やみくもに CURLOPT_SSL_VERIFYPEER を false に指定するのは良くないです.この処理は,私の回答の補足画像の「〜にアクセスする (安全ではありません)」をクリックすることに相当します.これは中間者攻撃を許してしまうことになります.また CURLOPT_HEADER もデフォルトで false なので,設定は不要です.
guest

0

https だし、file_get_contents のSSL対応ですね。
1、「allow_url_fopen」を有効にする
2、「openssl」を有効にする

https://www.google.co.jp/
このページアクセスできますか?

投稿2016/03/07 12:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

curlでやるのは無しなんですか?
file_get_contentsじゃないと行けない理由は何でしょう・・・?

http://stackoverflow.com/questions/7120586/soap-request-in-php-with-curl

投稿2016/03/07 10:18

fagai

総合スコア2158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問