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

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

ただいまの
回答率

90.48%

  • PHP

    24462questions

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

file_get_contentsでsoap通信をしたい

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 2,741

m.a.684351

score 8

PHPでfile_get_contentsを使ってsoap通信をしなければなりません

下記のように記述しましたが404エラーが帰ってきてしまいます。
どうすれば正常に通信できるでしょうか?

const REQUEST_URL = "https://www.test.org?wsdl";
$header = "<?xml version='1.0' encoding='UTF-8'?><head><id>abc123456</id><password>1234</password></head>";
$body = "<?xml version='1.0' encoding='UTF-8'?><root><testRequest>test</testRequest><testRequest2>test2</testRequest2><version>2.00</version></root>"

$post_data1 = array('xml' => $header);
$post_data2 = array('xml' => $body);

$stream_options = array(
            'http' => array(
                'method' => 'POST',
                'header' => http_build_query($post_data2),
                'content' => http_build_query($post_data1)));

$context = stream_context_create($stream_options);
$response = file_get_contents(REQUEST_URL, null, $context);

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

 本題

まず

下記のように記述しましたが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はこの形式に従っているように見えません.

POST /MySERVER/myWSDLservice.asmx HTTP/1.1
Host: connection.mywebsite.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://connection.mywebsite.com/MySERVER/GetCarType"

<?xml version="1.0" encoding="utf-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/">
 <soap:Body>
  <GetCarType xmlns="http://connection.mywebsite.com/MySERVER/">
    <IDNumber>string</IDNumber>
  </GetCarType>
 </soap:Body>
</soap:Envelope>

 蛇足

この用途では SoapClientが一番使いやすいと思うんですが…
XMLを書かずに,あたかも普通のPHPのコードを書いているような気分で書けますよ.

<?php
try {

   $client = @new \SoapClient('https://example.com/?wsdl');
   if (!$client) {
       $error = error_get_last();
       throw new \Exception($error['message']);
   }
   $result = $client->doSomethingAction(
       'Hello', // (type: "string"; name: "param0")
       'World', // (type: "string"; name: "param1")
       new \SoapVar('2016-03-07', XSD_DATE) // (type: "date"; name: "param2")
       new \SoapParam(
           new \SoapVar('2015-12-25', XSD_DATE), // (type: "date")
           "christmas" // (name: "christmas")
       )
   );
   var_dump($result);

} catch (\Exception $e) {

   var_dump($e->getMessage());

}

 cURLのCURLOPT_SSL_VERIFYPEER についての補足画像

(Noriyuki_sasaさんの回答へのコメント参照)

Chrome

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

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

function curl_get_contents( $url, $timeout = 60 ){
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_HEADER, false );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec( $ch );
    curl_close( $ch );
    return $result;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/08 00:03 編集

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    24462questions

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