Нет данных PUT о получении - PullRequest
       18

Нет данных PUT о получении

1 голос
/ 09 ноября 2011

Я отправляю запрос 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;

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

убедитесь, что вы указали заголовок длины содержимого и задали поля сообщения в виде строки

$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); 
0 голосов
/ 09 ноября 2011

Используйте клиентский класс 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);

Обратите внимание, что вы используете поток для отправки данных.

...