Подтвердить что ты не робот

Curl и PHP - как я могу передать json через curl с помощью PUT, POST, GET

Я работаю над созданием API Rest для этого черта, и я тестировал его, когда я продолжаю использовать 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 для создания завитка. Как вы можете видеть, я передаю данные как строку json. Я читал об этом, и я думаю, что могу, возможно, сделать POST и включить поля POST, но мне не удалось выяснить, как передать данные HTTP-тел с помощью GET. Все, что я вижу, говорит, что вы должны привязать его к URL-адресу, но в форме командной строки это не выглядит так. В любом случае, мне бы это понравилось, если бы кто-то мог написать правильный способ сделать эти четыре операции в PHP здесь на одной странице. Я хотел бы увидеть самый простой способ сделать это с curl и php. Я думаю, мне нужно передать все через тело http, потому что мой php api ловит все с помощью php://input

4b9b3361

Ответ 1

PUT

$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);

POST

$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);

GET См. Ответ @Dan H

DELETE

$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/jmoraleda/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'] строка с заголовками ответов

Надеюсь, что это поможет

Ответ 3

Для себя я просто кодирую его в URL-адресе и использую $_GET на целевой странице. Вот пример строки.

$ch = curl_init();
$this->json->p->method = "whatever";
curl_setopt($ch, CURLOPT_URL, "http://" . $_SERVER['SERVER_NAME'] . $this->json->path . '?json=' . urlencode(json_encode($this->json->p)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);

РЕДАКТИРОВАТЬ: добавление фрагмента назначения... (EDIT 2 добавлено выше выше при запросе OP)

<?php
if(!isset($_GET['json']))
    die("FAILURE");
$json = json_decode($_GET['json']);
$method = $json->method;
...
?>

Ответ 4

установить еще одно свойство curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);