2013-09-30 5 views
5

Я пытаюсь разработать RESTful API с PHP без использования фреймворков. При обработке запроса, данные клиента не могут быть считаны с помощью этого: parse_str(file_get_contents("php://input"), $put_vars);Данные запроса REST не могут быть прочитаны методом 'put'

Вот полный код:

public static function processRequest() { 

    //get the verb 
    $method = strtolower($_SERVER['REQUEST_METHOD']); 

    $request = new Request(); 

    $data = array(); 
    $put_vars = array(); 

    switch ($method) { 
     case 'get': 
      $data = $_GET; 
      break; 
     case 'post': 
      $data = $_POST; 
      break; 
     case 'put': 
      parse_str(file_get_contents("php://input"), $put_vars); 
      $data = $put_vars; 
      echo $data; 
      break; 
    } 

    $request->setMethod($method); 
    $request->setRequestVars($data); 

    if (isset($data['data'])) { 
     $request->setData(json_decode($data)); 
     echo 'data exists'; 
    } 

    return $request; 
} 

Я использую cURL, чтобы отдохнуть API и при вводе этой команды: curl -i -X PUT -d '{"name":"a","data":"data1"}' http://localhost/my-rest-api/api/ Я только получить это обратно:

Array""

Почему не возвращается правильные данные?

EDIT

Я также протестировали another piece of code, который должен быть API и file_get_contents('php://input', true) до сих пор возвращает нуль. Может быть, что-то не так с веб-сервером?

+0

не используют 'echo $ data' для тестирования, используйте либо' var_dump ($ data) ', либо' print_r ($ data) ' –

+0

Я воссоздал ваш код на своем сервере и смог запустить его с помощью команды curl и он производит требуемый результат. –

ответ

14

The parse_str используется для разбора строки запроса (в виде арг1 = хуг & арг2 = ABC), а не JSON. Для анализа строк JSON вам необходимо использовать json_decode.

$data = json_decode(file_get_contents("php://input"), true); 

Вот код, который работает:

$method = strtolower($_SERVER['REQUEST_METHOD']); 
$data = array(); 

switch ($method) { 
    case 'get': 
     $data = $_GET; 
     break; 
    case 'post': 
     $data = $_POST; 
     break; 
    case 'put': 
     $data = json_decode(file_get_contents("php://input"), true); 
     break; 
} 

var_dump($data); 

Curl команда:

curl -i -X PUT -d '{"name":"a","data":"data1"}' http://my-server/my.php 

Ответ:

array(2) { 
    ["name"]=> 
    string(1) "a" 
    ["data"]=> 
    string(5) "data1" 
} 
+0

@ShimoRachlenko Я только что отредактировал код и по-прежнему получаю те же результаты – Igor

+0

Можете ли вы подтвердить, что 'file_get_contents (" php: // input ")' дает вам данные, которые вы отправляете? И еще одно: как вы выводите результат? –

+0

Как это можно подтвердить? Пока вывод печатается с использованием «эха», как показано выше. – Igor

1

Может быть, есть что-то неправильно с веб-сервером?

На самом деле да. После того, как стучали голову на это в течение нескольких часов, я обнаружил, что виновник недостающих данных был такой:

Note: Prior to PHP 5.6, a stream opened with php://input could only be read once 

Другим куска кода обратившегося к PHP: // ввода до моего кода, и на серверах php < 5.6, это привело к потере ввода.

Только на запросах PUT.

+0

Это было очень полезно. Спасибо, что поделились. –

Смежные вопросы