0

次のコードは、_REQUEST 変数を var_dump するだけのテスト ページにデータを送信します。ページは post パラメータを取得せず、get パラメータを取得します。これはなぜですか?

<?php
     $jsonData = '{"Page":"index.html","KeyNumber":12132321}';
     $timeout = 20; 
     $options = array(
       CURLOPT_URL => "http://myadmin/postdump.php?AID=100&age=5&ishide=0",
       CURLOPT_RETURNTRANSFER => true, 
       CURLOPT_CONNECTTIMEOUT => $timeout,
       CURLOPT_POST => true,
       CURLOPT_POSTFIELDS =>'jsonData='.$jsonData,
       CURLOPT_ENCODING=>"",
       CURLOPT_FOLLOWLOCATION=>true
       );

     $ch = curl_init();
     curl_setopt_array($ch, $options);
     $file_contents = curl_exec($ch);
     curl_close($ch);

     echo  $file_contents;
?>  
4

2 に答える 2

0

オプションについては、curl_setoptマニュアル ページで説明されています。提供される情報CURLOPT_POSTFIELDSは次のとおりです。

HTTP「POST」操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の前に @ を付け、フル パスを使用します。ファイルタイプは、ファイル名の後に「;type=mimetype」の形式でタイプを指定することにより、明示的に指定できます。このパラメーターは、'para1=val1¶2=val2&...' のような urlencoded 文字列として渡すか、フィールド名をキーとし、フィールド データを値とする配列として渡すことができます。値が配列の場合、Content-Type ヘッダーは multipart/form-data に設定されます。PHP 5.2.0 以降、ファイルが @ 接頭辞付きでこのオプションに渡される場合、値は配列でなければなりません。

だから私はこれではなくそれを推測します:

CURLOPT_POSTFIELDS =>'jsonData='.$jsonData,

...次のようなものが必要です:

CURLOPT_POSTFIELDS => array('jsonData' => $jsonData),
于 2012-06-14T16:20:08.717 に答える
0

urlencode 関数を使用してフィールドの値をエンコードしてみてください。たとえば、ヘッダーを含む配列を CURLOPT_HTTPHEADER オプションに渡すフォーム リクエストをシミュレートするために、リクエストにヘッダーを追加することもお勧めします。

   $headers = array(
      'Host: domain.com',
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Encoding: gzip, deflate',
      'Content-Type: application/x-www-form-urlencoded'
   );

最近、いくつかのフォームのテストに役立つように、以下に添付されたcurlユーティリティクラスで作業していました。これが役立つことを願っています:

<?php

define('CURLMANAGER_USERAGENT_MOZ4', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
/**
 * 
 * Makes remote calls via http protocol
 * @author Alejandro Soto Gonzalez
 *
 */
class CURLManager {
    private $fields = array();
    private $headers = false;
    private $method = '';
    private $url = '';
    private $response = '';
    private $header = false;

    /**
     * 
     * Constructor
     * @return void
     */
    public function __construct() {

    }

    /**
     * 
     * Executes the http request
     * 
     * @param string $useragent Request user agent
     * @param string $fields Post values to be sent in the request body
     * @param array $headers Request headers
     * @param string $method Http method POST, GET, etc..
     * @param string $url Remote url
     * @param boolean $header true if the response should contain the http headers and  false if not
     * @return void
     */
    public function executeRequest($useragent, $fields, $headers, $method = 'POST', $url, $header = false) {
        $this->fields = $fields;
        $this->method = $method;
        $this->url = $url;
        $this->headers = $headers;
        $this->header = $header;
        $this->initializeCURL($useragent);
    }

    /**
     * 
     * Gets the response retrieved from the http request
     * @return void
     */
    public function getResponse() {
        return $this->response;
    }

    /**
     * 
     * Initializes curl and executes the request
     * @param string $useragent Request user agent
     * @return void
     */
    private function initializeCURL($useragent) {
        $ch = curl_init($this->url);
        $this->addFieldsToRequestBody($ch, $this->method);
        $this->addGenericOptions($ch, $useragent);
        $this->showResponseHeaders($ch, $this->header);
        $this->addRequestHeaders($ch, $this->headers);
        $this->response = curl_exec($ch);
        curl_close($ch);
    }

    /**
     * 
     * Adds generics options to the current curl object
     * @param curlObject $ch
     * @param string $useragent Request user agent
     * @return void
     */
    private function addGenericOptions($ch, $useragent) {
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/sourceforge/bouncer-logger-tester/cookies.txt');
    }

    /**
     * 
     * Adds the data fields to request body
     * @param curlObject $ch
     * @param string $method Http method POST, GET, etc..
     * @return void
     */
    private function addFieldsToRequestBody($ch, $method) {
        if ($this->method=='POST') {
            curl_setopt($ch, $this->getCurlMethod(), true);
            curl_setopt($ch, $this->getCurlFieldsMethod(), $this->fields);
        }
    }

    /**
     * 
     * Adds headers to the current request
     * @param curlObject $ch
     * @param array $headers Array containing the http header
     */
    private function addRequestHeaders($ch, $headers) {
        var_dump($headers);
        if ($headers !== false) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
    }

    /**
     * 
     * Gets the curl method id
     * @return integer
     */
    private function getCurlMethod() {
        switch ($this->method)  {
            case 'POST': return CURLOPT_POST;
            default: return CURLOPT_POST;
        }
    }

    /**
     * 
     * Show response headers in the full text response
     * @param curlObject $ch
     * @param boolean $show True to show headers and false to not
     * @return void
     */
    private function showResponseHeaders($ch, $show) {
        if ($this->header) {
            curl_setopt($ch, CURLOPT_HEADER, 1);
        }
    }

    /**
     * 
     * Gets curl fields option
     * @return void
     */
    private function getCurlFieldsMethod() {
        switch ($this->method)  {
            case 'POST': return CURLOPT_POSTFIELDS;
            default: return CURLOPT_POSTFIELDS;
        }
    }
}

?>
于 2012-06-14T17:39:30.150 に答える