Как проверить передачу данных RESTful API в POST?

0

Мне нужно проверить свой php API от cli.

Это мой php-скрипт test.php:

<?php
    $request = new Request();
    if (isset($_SERVER['PATH_INFO'])) {
        $request->url_elements = explode('/', trim($_SERVER['PATH_INFO'], '/'));
    }
    $request->method = strtoupper($_SERVER['REQUEST_METHOD']);
    switch ($request->method) {
        case 'GET':
            $request->parameters = $_GET;
        break;
        case 'POST':
            $request->parameters = $_POST;
        break;
        case 'PUT':
            parse_str(file_get_contents('php://input'), $request->parameters);
        break;
    }
    print $request->method . ": "; print_r($request->parameters); # DEBUG
?>

Это моя попытка, используя curl (как широко документировано в Интернете...):

$ curl -X POST -H "Content-type: application/json" -d '{"key":"value"}' http://localhost/test.php

И это результат:

_GET: Array
(
)
_POST: Array
(
)

Я бы ожидал, вместо этого, "ключ: значение" в _POST...

Что мне не хватает?

PS: извините, я знаю, что я делаю очень глупую ошибку, я чувствую себя очень немой... :-(

Теги:
curl
rest
post

2 ответа

1
Лучший ответ

Вы используете POSTING JSON, но пытаетесь интерпретировать данные с кодировкой по URL. Вы должны использовать $postdata = file_get_contents("php://input");

  • 0
    Большой! Спасибо ... Я знал, что упускаю что-то простое ... :-)
  • 0
    Итак, как мне использовать curl для POST-данных в кодировке urlform? Возможно ли это (извините, я новичок в HTTP ... :-()?
Показать ещё 1 комментарий
0

Вы не должны тестировать REST API таким образом. Код тестирования не должен содержать никакой структуры URI. Клиентам REST вы всегда должны следовать ссылкам, предоставленным API, и находить соответствующую ссылку на основе метаданных (например, связей ссылок, RDF и т.д.), Прикрепленных к ней. Если вы не можете следовать основным ограничениям REST (в этом случае равномерному ограничению интерфейса), почему вы называете ваш API как REST?

В вашем случае GET http://example.com/api/v1/ должен вернуть ссылку примерно так:

{ relation: "http://example.com/api/v1/docs/createItem" uri: "http://example.com/api/v1/", method: "POST", headers: { contentType: "application/json" }, data: { key: "value" } }

Ваш тестовый код должен быть похож на этот:

$apiRoot = 'http://example.com/api/v1/'

$response1 = getHttp($apiRoot);
expect($response1->headers->statusCode)->toBe(200);
$data1= parseJson($response1);

$link2 = findLinkByRelation($data1, $apiRoot.'docs/myCollection/createItem');
$response2 = followLink($link2);
expect($response2->headers->statusCode)->toBe(201);
$data2 = parseJson($response2);

$link3 = findLinkByRelation($data2, $apiRoot.'docs/myCollection/getItem');
$response3 = followLink($link3);
expect($response3->headers->statusCode)->toBe(200);
$data3 = parseJson($response3);
expect($data3)->containProperty(array("key" => "value"));

Таким образом, тестовый код будет слабо связан с реализацией сервиса, как и с реальными клиентами, поэтому его можно использовать в качестве шаблона реальных клиентов.

Btw. это называется сквозным тестированием вашего сервиса. Вы можете сделать это быстрее, если вы издеваетесь над HTTP-частью, переопределив суперглобалы, например $ _SERVER, $ _POST и т.д. В ваших тестах.

Ох, я прочитал ваш вопрос. $ _POST анализирует только application/x-www-form-urlencoded и multipart/form-data. Таким образом, вы должны получить исходные данные с входным потоком и проанализировать его вручную, но вам действительно нужна инфраструктура HTTP, например http://www.slimframework.com/, http://symfony.com/ и т.д.... который делает это автоматически. Но это не о том, как вы должны тестировать свой API. :-)

  • 0
    Ваш ответ мне не очень понятен, извините ... Не могли бы вы рассказать подробнее? Я обновил свой вопрос, показывая мой реальный код ... Можете ли вы привести пример, как проверить мой API из cli? И почему я не должен называть это "ОТДЫХ"?
  • 0
    @MarcoS Ofc. Я редактировал.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню