如何在POST中测试RESTful api传递数据?

时间:2015-01-16 16:26:16

标签: php api rest post curl

我需要从cli测试我的php API。

这是我的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 ...

中的“key:value”

我想念什么?

P.S。:抱歉,我知道我犯了一些非常愚蠢的错误,我感到非常愚蠢......: - (

2 个答案:

答案 0 :(得分:1)

您正在发布JSON但尝试解释urlform编码的数据。您应该使用$postdata = file_get_contents("php://input");

答案 1 :(得分:0)

您不应该以这种方式测试REST API。测试代码不得包含任何URI结构。通过REST客户端,您始终必须遵循API提供的链接,并根据附加到其上的元数据(例如链接关系,RDF等)找到正确的链接。如果您不能遵循基本REST constraints(在这种情况下为统一接口约束),为什么要将您的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"));

这样,测试代码将像真实客户端一样松散地耦合到服务实现,因此它可以用作真实客户端的模板。

顺便说一下。这称为您的服务的端到端测试。如果你通过覆盖超级全局来模拟HTTP部分,比如你的测试中的$ _SERVER,$ _POST等,你可以加快速度。

哦,我读了你的问题。 $ _POST仅解析application/x-www-form-urlencodedmultipart/form-data。因此,您必须使用输入流获取原始发布数据并手动解析,但您真正需要的是HTTP框架,例如http://www.slimframework.com/http://symfony.com/等...会自动执行此操作。但这不是关于如何测试API的。 : - )