Php 如何在Kohana 3中执行外部请求?

Php 如何在Kohana 3中执行外部请求?,php,curl,kohana,kohana-3,Php,Curl,Kohana,Kohana 3,我一直使用cURL来处理这类事情,但是我想我可以使用Kohana3中的request对象轻松地请求另一个页面 $url = 'http://www.example.com'; $update = Request::factory($url); $update->method = 'POST'; $update->post = array( 'key' => 'value' ); $update->

我一直使用cURL来处理这类事情,但是我想我可以使用Kohana3中的request对象轻松地请求另一个页面

    $url = 'http://www.example.com';

    $update = Request::factory($url);

    $update->method = 'POST';

    $update->post = array(
        'key' => 'value'
    );  

    $update->execute();
    echo $update->response;
但是我得到了错误

Accessing static property Request::$method as non static
从这里我可以假设这意味着该方法是静态的,但这对我没有多大帮助。我还复制并粘贴了那篇文章中的示例,它抛出了相同的错误

基本上,我正在尝试在外部服务器上发布一个新页面,并使用Kohana方法


那么,我这样做是否正确,还是应该只使用cURL(或
file\u get\u contents()
和上下文)?

请阅读底部的内容

本例中使用的请求类 当前可作为 科哈纳核心开发分公司 我的个人github帐户,可以 从 . 如果 使用官方的Kohana PHP3.0 下载,一个自定义的 请求类是必需的


另请参见。

请求对象用于请求应用程序中的页面。您不能将其用于外部URL。哦,您不必使用curl,您可以通过这样做来简化:

$page = file_get_contents('http://google.com');

我不知道这是否最初是在OP使用Kohana 3.0时编写的,但主要版本Kohana 3.1使这一点变得非常容易。Remote::get()已被弃用(一开始就不是那么好)。在Kohana 3.1中实现这一点很简单,您几乎已经做到了:

$url = 'http://www.example.com';

$request = Request::factory($url)
    ->method('POST')
    ->post('key', 'value');

$response = $request->execute();

echo $response->body();

我移动了一些东西来利用链接语法的简洁性。通过响应,您还可以检查响应代码。有关更多信息,请阅读和的3.1 API文档(它处理这些外部的,即不在应用程序内的请求。

我必须为我想发送的
帖子创建一个流上下文。我的印象是,允许通过文件内容发送外部URL是一种安全风险,而且不好practice@mike:那么你的印象就错了。假设你有一个硬编码的URL(就像在我的例子中),这绝对没有什么不安全的地方。当然这取决于你的实现。上面的例子是安全的,当人们使用动态输入时,它变得不安全,并且不限制http域请求,从而打开了远程代码注入的大门。@mike:只有在出于某种原因执行此函数返回的字符串时才会出现问题,而不管怎样,您都不应该执行此函数返回的字符串。根据Kohana文档,$request->execute()返回一个请求对象。无需调用$request->execute()->response();实际上,您必须调用
response()
函数,否则您仍在处理请求对象。请求类和响应类都有一个可以读取的主体。
body()
请求的内容正是请求正文。大部分情况下,这意味着任何形式的数据都会进入,等等。这不是您想要的行为,如果能够准确地返回您发送的内容,肯定会很奇怪!Jason,使用3.13,我想,我得到的结果与Diego类似。您的示例错误为“Undefined method:Response::Response()如果我将该行更改为“$response=$request->execute();”,它将按预期工作。@SkippyFlipjack,你说得对。由于迭戈的评论说
execute()
返回了一个请求,我感到困惑。
execute()
方法实际上返回了一个响应对象。我相应地更新了答案:)