簡體   English   中英

如何測試RESTful api在POST中傳遞數據?

[英]How to test RESTful api passing data in POST?

我需要從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(在Web上廣泛記錄...):

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

結果如下:

_GET: Array
(
)
_POST: Array
(
)

我希望在_POST “鍵:值” ...

我想念什么?

PS:對不起,我知道我在犯一些非常愚蠢的錯誤,我感到非常愚蠢... :-(

您正在發布JSON,但嘗試解釋urlform編碼的數據。 您應該使用$postdata = file_get_contents("php://input");

您不應以這種方式測試REST API。 測試代碼不得包含任何URI結構。 對於REST客戶端,您始終必須遵循API提供的鏈接,並根據附加到該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"));

這樣,測試代碼將像真實客戶端一樣松散地耦合到服務實現,因此可以將其用作真實客戶端的模板。

順便說一句。 這稱為服務的端到端測試。 如果您在測試中通過覆蓋超全局變量(例如$ _SERVER,$ _ POST等)來模擬HTTP部分,則可以使其更快。

哦,我讀了你的問題。 $ _POST僅解析application/x-www-form-urlencodedmultipart/form-data 所以,你必須獲得與輸入流中的原始數據后手動解析它,但你真正需要的是一個HTTP框架,如http://www.slimframework.com/http://symfony.com/等...這是自動執行的。 但這與您應該如何測試API無關。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM