1

Windowsコマンドラインから完全に機能する次のcurlコマンドがあります。

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d   "{\"name\":\"Name\",\"password\":\"1234\",\"email\":\"somebuy@bla.com\"}"   http://localhost:8080/users

したがって、この投稿の jSon は次のとおりです。

{\"name\":\"Name\",\"password\":\"1234\",\"email\":\"somebuy@bla.com\"}

次のPHPコードを使用して実行しようとしました:

$ch = curl_init(); // initialize curl handle
$user_agent = $_SERVER['HTTP_USER_AGENT']; 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_URL, $url); // set url to post to
curl_setopt($ch, CURLOPT_FAILONERROR, 1); // Fail on errors
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
curl_setopt($ch, CURLOPT_PORT, $port); //Set the port number
curl_setopt($ch, CURLOPT_TIMEOUT, 5); // times out after 5s
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if (!empty($request)) {
  curl_setopt($ch, CURLOPT_POST, true);   
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request)); // add POST fields
}

if($port==443) {
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
}

$data = curl_exec($ch); // if($data === false) echo 'Curl error: ' . curl_error($ch);
$error = curl_errno($ch);
curl_close($ch);

if ($error) {
  $error_codes = $this->_get_curl_error_codes();
  echo
    'Sorry, but we are currently not able to connect to the database. Error code '.$error.': '.$error_codes[$error];
  die();
}

このコードを次のように使用します。

$url = 'http://localhost/users';
$port = 8080;
$request = array();
$request['name']        = 'Name';
$request['password']    = '1234';
$request['email']       = 'somebuy@bla.com';

Json は次のように作成されます。

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request)); // add POST fields

私の問題は、コマンド ラインから実行すると機能するが、上記のコードを使用して実行すると機能しないことです。理由はありますか?

4

2 に答える 2

1

コンソールからのcurlコマンドはPUTを使用していますが、POSTを使用しています

次のオプションを試す

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$json);

http://www.lornajane.net/posts/2009/putting-data-fields-with-php-curl

うまくいかない場合は、ヘッダーも追加してください

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($json)));

もう1つ: $this->_get_curl_error_codes();あなたのコードにそのようなメソッドがありますが、私は気づきませんでした

于 2012-11-13T07:04:30.973 に答える
0

このコードはあなたを助けるかもしれません

function get($url, $params=array()) {   

  $url = $url.'?'.http_build_query($params, '', '&');
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  $response = curl_exec($ch);

  curl_close($ch);

  return $response;

}
于 2013-10-18T17:32:16.987 に答える