• 締切済み

PHPでのRAWデータの受け取り方

こんにちわ。 PHPについて質問させて下さい。 PEARのHTTP_RequestのaddRawPostData()でXML文書をmessage bodyに突っ込んで POSTメソッドで投げて、受ける側ではPOSTで取得しているのですが、 $_POSTでmessage bodyを受け取った場合、 var_dump($_POST); 出力: array(1) { ["<entry_xmlns=\"ttp://purl_org/atom/ns#\">postのテスト</entry>"]=> string(0) "" } などとなり、 message bodyの内容が無条件に$_POSTのキーになり、 「空白」であるところが「_(アンダーバー)」に変換されてしまいます。 APIを通常のPOSTやGETデータでつついてレスポンスのXMLを受け取ってパース・・・というのはよくやっているのですが、 XMLで受け取るAPIをPHPで作った事が無かったのでどうにも知識不足です。 そもそもこのやり方でいいんだろうか。 どなたかご教授ください。

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

>ちなみにですがレスポンスのステータスコードを操作もしたいのですが >なにかいい方法はないでしょうか。 header関数で指定すればOKです。 > header("HTTP/1.1 201 Created"); 詳しくは参考URL(っていうかマニュアルですが)を見てください。

参考URL:
http://www.php.net/manual/ja/function.header.php
youkee
質問者

お礼

ありがとうございました! phpのマニュアル読んでたら普通に書いてありました。 というか、とくに何も考えず質問してしまってすいませんでしたm(_ _)m 逆に丁寧に答えて頂いてどうもです!

全文を見る
すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

php://inputから生のPOSTデータが取得出来ます。 file_get_contentsやfopenなどを使って生データを読み込んだら、後はDOM関係のクラスやAPIを使用してDOMに落としてあげると良いと思います。

youkee
質問者

お礼

おっしゃるとおりで・・・ カンタンにできました。 orz peclまで入れてみた自分のアホさ加減にびっくりです。 ちなみにですがレスポンスのステータスコードを操作もしたいのですが なにかいい方法はないでしょうか。 201 created として返したかったりするのですが・・・ よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPのHTTP/Requesをローカルでテストする方法は?

    PHP初心者なのですが、 初めてPHPのPEARパッケージにあるHTTP/Requestクラスを使って、別サーバーのAPIに対し、XMLのリクエストをし、XMLのレスポンスを受け取るやり取りをする関数を作りたいと思い、下記のような関数を作ってみたのですが、ローカル環境でどのようにテストすれば、HTTP/Requestの挙動をうまく確認できるかが思い浮かばずに、止まってしまいました。 どのようにテストすれば挙動がローカルで確認できるか、どなたか、ご教授お願いします!!! ----------- 制作した関数 引数1:リクエスト先URL、引数2: function testHttp($requestUrl,$requestXml){ $option = array( "timeout" => "3", // タイムアウトの秒数指定 "allowRedirects" => true // リダイレクトの許可 ); // HTTP_Requestの初期化 $http = new HTTP_Request($requestUrl, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", $obj->protMember('LOGIN_URL')); $http->setMethod(HTTP_REQUEST_METHOD_POST); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $responseVal['resCode'] = $http->getResponseCode(); // ResponseCode $responseVal['resBody'] = $http->getResponseBody(); // ResponseBody return $responseVal; }else{ exit(); } }

    • 締切済み
    • PHP
  • atomのパースについて

    いま、TwitterのAPIについて色々と研究しています。 searchのAPIで取得した、atom形式のファイルをパースしたいのです。たとえば、@twitterを含むものを検索して、その結果をパースして、表示したい場合は、 <?php $test=file_get_contents("http://search.twitter.com/search.atom?q=%40twitter"); $xml=simplexml_load_string($test); print($xml); ?> で良いのかと思っていたのですが、サイト上でphpファイルを実行しても、真っ白な画面が表示されるだけで上手くいきません。 どこがおかしいのでしょう? 基本的なところがわかっていない気がするのですが、どこがわかってないのかすら良くわからなくなってきました。 ご教示をお願い致します。

    • ベストアンサー
    • PHP
  • PEARのXML/Unserializer.phpが見つからない

    PHP5をインストールしたローカル環境で、落ちていたサンプルコードを改造して使おうとしているのですが、PearのXML/Unserializer.phpが無いと言われます。 PEARのサイトで検索してみても見つかりません。 どこで見つけたらよいのでしょうか? それともPHP5では使えないのでしょうか? ちなみに落ちていたサンプルコードは以下の通りです。 <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>PHPのPEARパッケージであるServices_Amazon</title> <meta name="description" content="Amazonウェブサービスを簡単に扱うことができるPEARのServices_Amazonを使ってみる。" /> </head> <body> <form method="POST" action="<?php $_SERVER['PHP_SELF'] ?>"> 書籍検索: <input type="text" name="keywd" size="30" maxlength="255" value="<?php print($_POST['keywd']); ?>" /> <input type="submit" value="検索" /> </form> <?php // 検索ボックスに入力されたかの判定 if($_POST['keywd'] != '') { $AWSAccessKeyId = "****************"; $Version = "2008-04-07"; $AssociateTag = "working16h-22"; $SearchIndex = "Books"; $ResponseGroup = "Medium"; $Keywords = htmlspecialchars($_POST['keywd']); require_once 'Services/AmazonECS4.php'; $amazon = new Services_AmazonECS4($AWSAccessKeyId,$AssociateTag); $amazon->setLocale('JP'); $option = array( 'Keywords' => $Keywords, 'Sort' => 'salesrank', 'ResponseGroup' => $ResponseGroup, 'Version' => $Version, ); $result = $amazon->ItemSearch($SearchIndex,$option); if(PEAR::isError($result)){ die($result->message); } foreach ($result["Item"] as $key => $value){ $ama1 = $value["DetailPageURL"]; $ama2 = $value["ItemAttributes"]["Title"]; $ama3 = $value["ItemAttributes"]["Author"][0]; print('<p>タイトル:<a href="' . $ama1 . '" target="_blank">' . $ama2 . '</a><br />著者:' . $ama3 . '</p>'); } } ?> </body> </html>

    • ベストアンサー
    • PHP
  • XMLデータをhttpリクエストで送信したい

    まずlibxml2ライブラリを使用してxmlDocPtr型のXMLデータを作成しました。 これをHTTPリクエストのボディ部に突っ込んで(POST?)リクエスト送信したいのですが、 どうすれば送信できるのでしょうか。 xmlDocPtr型のXMLデータをchar型に格納すればいけるのかなと思っているんですが。 libxml2ライブラリでxmlDocPtr型データをバイナリに変換するAPIがよく分かりません。 お知恵を拝借させて下さい。

  • phpでサイト構築していて困っています

    ホットペッパーAPIを使ってサイトを作っています。まだ知識が浅く分からないことが多いのですが、下記について教えて下さい。 <?php //サイト設定 $site['title'] = "APIサンプルサイト"; $site['url'] = "http://●●.jp"; $site['mojicode'] = "Shift_JIS"; $site['info'] = "ホットペッパービューティーAPIのサンプルです"; //XMLデータ取得用ベースURL $req = "http://webservice.recruit.co.jp/beauty/salon/v1/"; //リクエストパラメータ設定 $name = "◎◎"; $name_kana = "××"; //XMLデータ取得用リクエストURL生成 $req .= "?name=".$name."&name_kana=".$name_kana; $xml = simplexml_load_file($req) or die("XMLパースエラー"); //HTML出力 echo <<<HTML <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>{$site['title']}</title> </head> <body> <h1>{$site['title']}</h1> <hr> {$site['info']} <hr> {$xml->salon->name}<br> {$xml->salon->name_kana}<br> </body> </html> HTML; ?> ------------------------------------ (APIキーを省略しています) 上記の様に作成したページに <?php include_once '../include/commons.php'; ?> を入れて別のphpファイルを参照したいのですが、どこに入れれば良いのでしょうか??もしくはこの文章を入れることはできないのでしょうか。 最終的に「../include/commons.php」を参照(読み込み?)できれば良いので、方法を教えて下さい。 昨日からずっと入れる場所をいろいろ変えて試してみましたが、うまくいきません。APIがからんでない別のphp文書の文頭に入れると動作するのですが・・。 質問の仕方が未熟で申し訳ありませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • phpからxmlへの文字化け

    PHPについての質問です。PHPのバージョンは5です。 FLASH8で作ったスクリプトからPHPに変数を送り、その変数をPHPからXMLに送っています。 しかしPHPからXMLに送ると日本語がちゃんと表示されません。何かPHPの方でしないとまずいのですか? <FLASH> System.useCodepage = true; SendData = new LoadVars(); //送りたいデータを箱に詰める this.btn_mc.onRelease = function() { _root.SendData.pro1 = nam; _root.SendData.pro2 = sbj; _root.SendData.pro3 = mail; _root.SendData.pro4 = product; //データ(中身)を詰めた箱をgetFlash.phpに送信 _root.SendData.sendAndLoad("http://localhost/php/xml_php/xml12.php", _root.SendData); }; <PHP> <?php /*変数を入れる*/ $name = $_POST["pro1"]; $sbj = $_POST["pro2"]; $add = $_POST["pro3"]; $msg = $_POST["pro4"]; /*時間を取得する*/ $stamp = time(); $date = date('Y,m/d(D)', $stamp); /*xmlに追加*/ $xml_path = "test1.xml"; $xml = file_get_contents( $xml_path ); $replace_key = "<article>"; $add_xml = $replace_key."\n<entry name='$name' dat='$date' tit='$sbj' contents='$msg'/>\n"; $result = str_replace($replace_key,$add_xml,$xml); file_put_contents( $xml_path , $result ); ?> <xml> <?xml version="1.0" encoding="utf-8"?> <article> <entry name="ha" dat="2008,03/10(Mon)" tit="test" contents="hogehoge"/> </article> となっています。

    • 締切済み
    • PHP
  • PHP5で名前空間を取り扱う

    楽天ウェブサービスの楽天トラベルキーワード検索APIを、PHP5で利用しようとしています。    ■楽天トラベルキーワード検索API     http://webservice.rakuten.co.jp/api/keywordhotelsearch/ 出力パラメータの一部は名前空間で定義されており、下記の参考Webサイトのコーディング例に従ってソースを実行しましたが、children関数を実行する行で、 "Fatal error: Call to a member function children() on a non-object in " と表示されてしまいました。 どのようにコーディングするのが正しいのか、教えていただけないでしょうか。 ■参考にしたWebサイト 「IBM PHPでのSimpleXML 処理」 http://www-06.ibm.com/jp/developerworks/xml/library/x-simplexml.shtml?ca=drs ■実行ソース $xml = simplexml_load_file($restURL) or die("XMLパースエラー"); $cd = $xml->Response->header->children('http://api.rakuten.co.jp/rws/rest/Header'); ■実行環境  PHP Version 5.1.4  Apache 2.0 Handler ■xmlの構造 <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> <Args> <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)">true</Arg> <Arg key="developerId" value="****">true</Arg> <Arg key="affiliateId" value="****">true</Arg> <Arg key="operation" value="KeywordHotelSearch">true</Arg> <Arg key="version" value="2007-04-11">true</Arg> <Arg key="keyword" value="アートホテルズ札幌">true</Arg> </Args> <Status>Success</Status> <StatusMsg /> </header:Header> <Body> <keywordHotelSearch:KeywordHotelSearch xmlns:keywordHotelSearch="http://api.rakuten.co.jp/rws/rest/KeywordHotelSearch/2007-04-11"> <hotelSimple> <hotelNo>5903</hotelNo> <hotelName>アートホテルズ札幌</hotelName> <areaSum /> <hotelSpecialSum /> <middleClassCode>hokkaido</middleClassCode> <smallClassCode>sapporo</smallClassCode> <hotelInformationUrl>http://img.travel.rakuten.co.jp/image/tr/api/kw/JBe8h/?f_no=5903</hotelInformationUrl> <hotelAffiliateUrl>http://***/hgc/04230ff1.13a55c09.04230ff2.eed97e0f/?pc=http%3A%2F%2Fimg.travel.rakuten.co.jp%2Fimage%2Ftr%2Fapi%2Fkw%2FJBe8h%2F%3Ff_no%3D5903</hotelAffiliateUrl> </hotelSimple> <recordCount>1</recordCount> </keywordHotelSearch:KeywordHotelSearch> </Body> </Response>

    • ベストアンサー
    • PHP
  • PHP初心者です。どうしてもエラーが出てしまいます。プログラマさんお願いします!!

    初めまして。閲覧ありがとうございます。 PHPを勉強中の素人です。 「Twitter」のBOTを何とか作りたいと思い、PHPを勉強しつつPHPのソースを公開している方を参考にさせて頂きながら何とか組んでみたのですが、どうしてもエラーが出てしまい動かせません。 構文エラーということは分かるのですが、何処がおかしいのか、分かる方は教えて頂けないでしょうか?初心者丸出しの質問で申し訳ありません。 長いのですがソースを書きます。 <?php require_once 'HTTP/Client.php'; //自分のタイムラインを所得 $username = "ユーザー名"; $password = "パス"; $page = "statuses/friends_timeline.xml"; $basic = array('Authorization'=>'Basic '.base64_encode($username.':'.$password)); $client = new HTTP_Client(null, $basic); $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml = new SimpleXMLElement($body); //ランダム発言を定義 $msg_pattern = array( "[someone]発言0", "[someone]発言1", "[someone]発言2", "[someone]発言3", "[someone]発言4", ); if($xml) { //var_dump ($xml); //該当する最新5件の発言を取得 for($i=0;$i<5;$i++){ $post_member = (string)$xml->entry[$i]->title; $post_date = $xml->entry[$i]->updated; //発言時刻を取得し、タイムスタンプに // 32400はGMTと日本時間とのズレ(9時間) $date_array = array(); $rcd = mbereg("^([0-9]{4}).([0-9]{2}).([0-9]{2})T([0-9]{2}).([0-9]{2}).([0-9]{2})Z$",$post_date,$date_array); $post_time = 32400 + mktime($date_array[4],$date_array[5],$date_array[6],$date_array[2],$date_array[3],$date_array[1]); //発言の経過時間 $pasttime = $now_time - $post_time; //発動は15分以内の発言に対して if($pasttime > 0 && $pasttime < 900 && !array_search($post_member,$followed)){ $tofollow = "@".$post_member." "; //発言をランダムで選択、相手の名前を置換 $msg = preg_replace("[\[someone\",$tofollow,$msg_pattern[mt_rand(0,count($msg_pattern)-1)]); //twitterへの書き込み $params = "status=". rawurlencode($msg); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); // array_push($followed,$post_member); } } }else{ return; } ?>

    • 締切済み
    • PHP
  • PHPでPEARを使った認証について

    PHPでPEARを使った認証をテストしています。 モバイルサイトでも使えるものを・・・ということで見つけたdinolibというものをサンプルに利用しました。 dinolib:http://openlab.dino.co.jp/ サンプル:http://openlab.dino.co.jp/?key=%5B%5Bdinolib_sample%5D%5D dinolibとpear、postgresをインストールし動作確認をしたところ adduser()が見つからずユーザ追加が出来ませんでした。 エラー:Fatal error: Call to undefined function: adduser() in /usr/local/share/dinolib/lib/auth/Auth.php on line 862 pear listではAuthパッケージは見えます。 Installed packages, channel pear.php.net: ========================================= Package Version State Archive_Tar 1.3.1 stable Auth 1.2.3 stable Auth_HTTP 2.1.6 stable Console_Getopt 1.2 stable DB 1.7.6 stable HTML_Template_IT 1.1 stable Mail 1.1.9 stable Net_SMTP 1.2.7 stable Net_Socket 1.0.6 stable Net_UserAgent_Detect 2.0.1 stable PEAR 1.4.5 stable PHPUnit 1.3.2 stable XML_Parser 1.2.7 stable XML_RPC 1.4.4 stable php.iniのinclude_pathにはpear、Authなどは追加してあります。 このエラーが言っているadduser()とは何の事を言っているのでしょうか?

    • ベストアンサー
    • PHP
  • PHPでの変数引渡しに関して

    "HTML -> PHP1 -> PHP2"という順序で変数の引渡しを行いたいと考えております。 "HTML -> PHP1"への変数引渡しは正常なのですが、"PHP1 -> PHP2"への変数引渡しがうまくいかない状態です。 1) "HTML -> PHP1" ・HTML <form name="toroku" method="POST" action="result.phtml">  <input type="text" name="word1" size="34"></td></tr>  <input type="text" name="word2" size="34"></td></tr>  ・・・・ </form> ・PHP1(result.phtml) <? require('../include/init.inc'); $word1 = $_POST{'word1'}; $word2 = $_POST{'word2'}; $word3 = $_POST{'word3'}; $email = $_POST{'word7'}; $word8 = $_POST{'word8'}; $seireki = $_POST{'seireki'}; $tuki = $_POST{'tuki'}; $nitiji = $_POST{'nitiji'}; $result = pg_query($con, "select .........."); $rows = pg_num_rows($result); var_dump($HTTP_POST_VARS); ?> <FORM action="./result2.phtml" method="post"></FORM> ・結果 array(8) { ["word1"]=> string(6) "テスト"       ["word2"]=> string(6) "テスト"       ["word3"]=> string(6) "テスト"       ["word7"]=> string(16) "test1@test.co.jp"       ["word8"]=> string(16) "test1@test.co.jp"       ["seireki"]=> string(4) "2008"       ["tuki"]=> string(2)"01"       ["nitiji"]=> string(2) "01" } 2) "PHP1 -> PHP2" ・PHP2 <? var_dump($HTTP_POST_VARS); ?> ・結果 array(0) { } 2)でHTMLの変数を継続して渡したいのです。 ご存知のかたがいたしたら、ご教示頂ければと思います。

    • ベストアンサー
    • PHP