Curl和PHP - 如何通过PUT,POST,GET通过curl传递json

2022-08-30 09:08:37

我一直在努力为它构建一个Rest API,并且我一直在通过从命令行使用curl来测试它,这对于CRUD来说非常容易。

我可以成功地从命令行进行这些调用

curl -u username:pass -X GET http://api.mysite.com/pet/1
curl -d '{"dog":"tall"}' -u username:pass -X GET http://api.mysite.com/pet
curl -d '{"dog":"short"}' -u username:pass -X POST http://api.mysite.com/pet
curl -d '{"dog":"tall"}' -u username:pass -X PUT http://api.mysite.com/pet/1

上面的调用很容易从命令行进行,并且可以很好地与我的api一起使用,但现在我想使用PHP来创建curl。如您所见,我以 json 字符串的形式传递数据。我已经阅读了四处,我认为我可能会做POST并包含POST字段,但我无法找到如何使用GET传递http body数据。我看到的所有内容都说您必须将其附加到URL,但在命令行表单上看起来并非如此。无论如何,如果有人能在一个页面上编写正确的方法来在PHP中执行这四个操作,我会很高兴。我希望看到使用curl和php进行操作的最简单方法。我认为我需要通过http体传递所有内容,因为我的php api捕获了所有内容,php://input


答案 1

$data = array('username'=>'dog','password'=>'tall');
$data_json = json_encode($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_json)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

发布

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

获取查看@Dan H 答案

删除

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

答案 2

您可以使用这个小型库:https://github.com/ledfusion/php-rest-curl

拨打电话非常简单:

// GET
$result = RestCurl::get($URL, array('id' => 12345678));

// POST
$result = RestCurl::post($URL, array('name' => 'John'));

// PUT
$result = RestCurl::put($URL, array('$set' => array('lastName' => "Smith")));

// DELETE
$result = RestCurl::delete($URL); 

对于$result变量:

  • $result['status'] 是 HTTP 响应代码
  • $result['data'] 一个解析了 JSON 响应的数组
  • $result['header'] 带有响应标头的字符串

希望它有帮助


推荐