Я отправляю запрос PUT на мой сайт через PHP с помощью cURL:
$data = array("a" => 'hello'); $ch = curl_init('http://localhost/linetime/user/1'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data)); $response = curl_exec($ch); var_dump($response);
Затем я слушаю этот запрос PUT, но не получаю никаких данных с запросом. Пожалуйста, скажите мне, где я ошибаюсь?
$putData = ''; $fp = fopen('php://input', 'r'); while (!feof($fp)) { $s = fread($fp, 64); $putData .= $s; } fclose($fp); echo $putData; exit;
не забудьте указать заголовок длины содержимого и задать почтовые поля в виде строки
$data = array("a" => 'hello'); $fields = http_build_query($data) $ch = curl_init('http://localhost/linetime/user/1'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //important curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields))); curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
Используйте HTTP-клиент для отправки запросов. Есть несколько доступных, но я создал один ( https://github.com/broshizzledizzle/Http-Client ), с которым я могу вам помочь.
Выполнение запроса PUT:
<?php require_once 'Http/Client.php'; require_once 'Http/Method.php'; require_once 'Http/PUT.php'; require_once 'Http/Request.php'; require_once 'Http/Response.php'; require_once 'Http/Uri.php'; use Http\Request; use Http\Response; header('Content-type:text/plain'); $client = new Http\Client(); //GET request echo $client->send( Request::create() ->setMethod(new Http\PUT()) ->setUri(new Http\Uri('http://localhost/linetime/user/1')) ->setParameter('a', 'hello') )->getBody(); ?>
Обработка запроса PUT:
//simply print out what was sent: switch($_SERVER['REQUEST_METHOD']) { case 'PUT': echo file_get_contents('php://input'); break; }
Обратите внимание, что у меня есть автозагрузчик в моих проектах, который будет загружать все это для меня, но вы можете захотеть создать файл, который будет включать все, если вы не хотите идти по этому маршруту.
Библиотека-менее:
//initialization code goes here $requestBody = http_build_query( array('a'=> 'hello'), '', '&' ); $fh = fopen('php://memory', 'rw'); fwrite($fh, $requestBody); rewind($fh); curl_setopt($this->curl, CURLOPT_INFILE, $fh); curl_setopt($this->curl, CURLOPT_INFILESIZE, strlen($requestBody)); curl_setopt($this->curl, CURLOPT_PUT, true); //send request here fclose($fh);
Обратите внимание, что вы используете поток для отправки данных.