【问题标题】:Create an HttpRequest from environment从环境创建一个 HttpRequest
【发布时间】:2009-09-26 15:24:20
【问题描述】:

我可以从环境中自动创建一个 HttpRequest 吗?换句话说,现在看来你必须……

$request = new HttpRequest;
$request->setCookies($_COOKIE);
$request->setHeaders(apache_request_headers());
$request->setPostFields($_POST);
$request->setQueryData($_GET);
$request->setRawPostData(file_get_contents('php://input'));
$request->setUrl($_SERVER['REQUEST_URI'']);

我们还需要设置方法——这很可笑,因为 $_SERVER['REQUEST_METHOD'] 是一个字符串,而 HttpRequest::setMethod 采用 HTTP_METH_* 系列内容中的一个 int。所以你必须建立自己的映射。

我想喜欢HttpRequest,但目前使用起来似乎很麻烦。我希望我错过了什么。


编辑:

我们的想法是让测试更简洁。 $_COOKIE 和朋友们是超全球的。你如何测试它?

function receiveRequest() {
    $code = 'that touches superglobals like' . $_COOKIE['example'];
    $response = new HttpResponse;
    $response->setStatus(200);
    return $response;
}

function testServer() {
    $oldCookie = $_COOKIE;
    $oldPost = $_POST;
    // etc...
    $_COOKIE = array('example' => 'stuff');
    $_POST = array();
    // etc...
    $response = receiveRequest();
    $_COOKIE = $oldCookie;
    $_POST = $oldPost;
    // etc...
    assert($response->getStatus() === 200);
}

你需要控制的不仅仅是你使用的状态——在这个例子中是 $_COOKIE——而是每一个超全局变量。 大约有十几个。在 HttpRequest 中包含所有这些内容会更简洁。

function receiveRequest(HttpRequest $request) {
    $code = 'is purely a function of arguments like' . $request->getCookie('example');
    $response = new HttpResponse;
    $response->setStatus(200);
    return $response;
}

function testServer() {
    $request = new HttpRequest;
    $request->setCookie('example' => 'stuff');
    $response = receiveRequest($request);
    assert($response->getStatus() === 200);
}

然后我的实际 server.php 将使用我正在寻找的假设静态方法。

$request = HttpRequest::generateRequestFromEnvironment($_COOKIE, $_POST, ...);
unset($_COOKIE, $_POST, ...);
$response = receiveRequest($request);
$response->send();

【问题讨论】:

    标签: php httprequest


    【解决方案1】:

    在我看来,这似乎是一个奇怪的用例——您想为...自己创建一个 HttpRequest?使用您传递的参数?为什么?

    正常情况是从另一个主机请求另一个资源,您想要的那种“自动设置”对此毫无用处。如果你真的需要这种情况,将它包装在一个易于重用的函数中似乎微不足道?

    【讨论】:

      【解决方案2】:

      从您发布的内容来看,我认为您使用 HttpRequest 作为容器来存储有关触发脚本的请求的所有信息。

      这不是它的用途——它是用于从您的脚本中向 其他 服务发出 HTTP 请求。例如,您可能会request data from the Flickr API

      【讨论】:

      • 我想从我自己的 API 请求数据。我想对该 API 进行单元测试。将传入和传出请求抽象到同一个类中,这似乎是 HttpRequest 的重点。毕竟,它们相同的东西。
      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2017-03-14
      • 2018-04-26
      • 2022-07-20
      相关资源
      最近更新 更多