2012-01-03 37 views
0

を失敗し、私はここに、この機能があります。投稿JSONデータと

public static function call($action, array $args) 
{ 
    $post_args = array(
       'action' => $action, 
       'args' => $args 
       ); 
    $stream = json_encode($post_args); 
    $headers = array(
       'Content-type: application/json', 
       'Accept: application/json', 
       'Expect:' 
       ); 
    $userpwd = self::$_user.':'.sha1(sha1(self::$_pass)); 

    $ch = curl_init(); 
    $args = array(
      CURLOPT_URL   => self::$_url, 
      CURLOPT_FOLLOWLOCATION => TRUE, 
      CURLOPT_RETURNTRANSFER => TRUE, 
      CURLOPT_POST   => TRUE, 
      CURLOPT_POSTFIELDS  => $stream, 
      CURLOPT_HTTPHEADER  => $headers, 
      CURLOPT_USERPWD  => $userpwd 
     ); 
    curl_setopt_array($ch, $args); 
    $res = curl_exec($ch); 
    $data = json_decode($res, true); 
    if (isset($data) === TRUE 
     && empty($data) === FALSE 
) { 
    $res = $data; 
    } 
    return $res; 

}//end call() 

と私が投稿してるURLで、私はやってる:

echo file_get_contents('php://input'); 
をしかなっていないが、データを投稿しても何が問題なの?私は行き詰まっている。

また、リダイレクトを行わずにローカルマシンの単純な仮想ホストURLに投稿するときに、CURLOPT_FOLLOWLOCATIONをTRUEに設定する必要があります。

EDIT:

public static function call($action, array $args) 
{ 
    $post_args = array(
       'action' => $action, 
       'args' => $args 
       ); 
    $stream = json_encode($post_args); 

    $userpwd = self::$_user.':'.sha1(sha1(self::$_pass)); 

    $opts = array(
      'http' => array(
         'method' => 'POST', 
         'header' => array(
            "Authorization: Basic ".base64_encode($userpwd), 
            "Content-type: application/json" 
            ), 
         'content' => $stream 
        ) 
     ); 

    $context = stream_context_create($opts); 

    $res = ''; 
    $fp = fopen(self::$_url, 'r', false, $context); 
    if($fp){ 
    while (!feof($fp)){ 
     $res .= fread($fp, 128); 
    } 
    } 
    return $res; 

}//end call() 

なしの成功を:

がそうのようにfopenでそれをやり直してみました。 resultと一緒にステータスを渡すので、接続はcurlとfopenで動作します(これは単なるphp://入力ストリームです)。何か案は?

答えて

0

問題が見つかりました。

私はhttp://localhost/apiを呼び出していました。私はindex.phpを自動的にロードすると思っていたので、フォルダのデフォルトのファイル名を変更しようとしていました。

問題は、最後にindex.phpを追加しなかったことです。私はhttp://localhost/api/index.phpを呼び出すべきでした。 これはcURLとfopenで動作します。

ファイル名を明かさずにAPIを呼び出す方法はありますか?

+0

あなたのPHPを置くフォルダに.htaccessファイルを置きます。 htaccessでこれらを書き留めてください: RewriteEngine On RewriteRule。* myfile.php [PT、L] すべてのリクエストはmyfile.phpに行きます。 – tcak

+0

動作していないようです。私はMoved Permanently 301レスポンスを取得し、CURLOPT_FOLLOWLOCATIONをtrueに設定すると、前と同じように空の結果が得られます。 – donkapone

+0

http://www.noupe.com/php/10-mod_rewrite-rules-you-should-know.htmlこれを確認してください。 htaccessを正しく書くのに役立つかもしれません。多分あなたは間違って書いたでしょう。また、何か、多分日付の時間、またはあなたが送ったリクエストをphpファイルのファイルに書き込もうとします。あなたはそれが正しく動作することを理解することができます。 – tcak

0

curl_exec関数が正常に終了することを確認できますか?また、なぜこの目的のためにfopenを使用しないのですか? JSON RPCクライアントとサーバーを作成しました。私はfopenでリクエストを送信しており、完璧に動作します。

 $httpRequestOptions = 
      array(
       'http'=>array(
        'method'=>'POST', 
        'header'=>'Content-type: application/json', 
        'content'=>$requestJSON 
       ) 
      ); 

     $context = stream_context_create($httpRequestOptions); 

     // send request 
     if($fileHandler = @fopen($serverURL, 'r', false, $context)){ 

私は残りの部分を書いていません。私が書いたこのコードを使うことができます。

+0

はい、ステータス整数も含むjsonエンコードされた配列をエコーし​​ているので、curl_execが正常終了してしまい、その部分を取得します。関数をfopenで書き直そうとします。 – donkapone

+0

私はそれをfopenでredidしましたが、file_get_contents( 'php:// input')でデータを取得することはできません。ステータスを読み込んだとしても。 – donkapone

+1

これについて確かめるために、あなたはserverURLの部分へのURLを書いていますよね?ファイルパスの代わりに。 'http:// localhost/server.php'のようなものでなければなりません。 'server.php'などのように書くと、動かない。送信されたパラメータは 'php:// input'に渡されません – tcak

関連する問題