2014-01-21 4 views
37

Я работаю над созданием API-интерфейса для остального, и я тестировал его, когда я использую curl from командная строка, которая очень легко для CRUDCurl and PHP - как я могу передать json через curl by PUT, POST, GET

Я могу успешно сделать эти вызова из командной строки

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 

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

ответ

111

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

ПОСТ

$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 ответа

УДАЛИТЬ

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

Спасибо за PUT, если вы можете добавить GET (с json в теле) и POST, я приму – Gilberg

+0

@ Гилберг добавил для POST. В GET-запросе данные проходят через url :) – voodoo417

+0

Спасибо, я не могу использовать Dan, потому что мой api ждет ввода php: //, и если я включу его в URL-адрес, он не пойдет в php: // входной поток. Короче говоря, я не могу схватить его от $ _GET, я мог бы, но это была бы небольшая головная боль. Я могу сделать это easliy из командной строки с помощью 'curl -d '{json-string}' -X GET http: // api.mysite.com/user', поэтому должен быть способ имитировать это в php – Gilberg

5

Для себя я просто кодирую его в 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: Добавление фрагмента кода назначения ... (EDIT 2 добавили еще выше по запросу OPS)

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

Спасибо, вы могли бы написать свой полный curl-код в php, чтобы понять, как вы определяете POST, GET, PUT, DELETE. Мой API ищет эти методы. – Gilberg

+0

Добавлено. Это просто простой HTTP-запрос, но, как вы можете видеть в пункте назначения, я использую GET.Это буквально просто перемещать строку json вокруг (например, от моего приложения до конца, до скрипта1, сценарию2, который затем возвращается обратно к интерфейсу приложения - не входит в исходный код). –

+0

+1, но я буду ждать POST, PUT и DELETE, потому что остальные api, которые я написал, нуждаются в них – Gilberg

8

Вы можете использовать эту маленькую библиотеку: 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); 

И для переменного $ результата:

  • $ результата [ 'статус'] код ответа HTTP
  • $ результата [ 'данные'] массив с ответом JSON разобран
  • $ результата [» заголовок '] строка с заголовками ответа

Надеется, что это помогает

0

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

+0

Это плохой совет. Установка этого флага означает, что вы не проверяете сертификат SSL. Это открывает вам угон DNS. – Machavity