【问题标题】:Error on HTTP Stream PHPHTTP 流 PHP 上的错误
【发布时间】:2012-05-18 18:18:45
【问题描述】:

我有这个方法:

protected function _sendRequest($url, $method, Busca_Cxense_Data $data, $get = null) {
    if (! isset ( $this->_urls [$url] )) {
        throw new Busca_Cxense_Exception_Argument ( "El tipo de url enviado no es valido. (type: {$url})" );
    }
    $url = $this->_urls [$url] . $data->getUrlKey () . ($get ? "$get" : '');
    $httpConfig = array ('http' => array ('method' => $method, 'request_fulluri' => $url, 'ignore_errors' => false ) );
    if ($data->getSendJson ()) {
        $json = $this->_setJson ( $data );
        $header = "Content-Type: application/json\r\nContent-Length: " . strlen ( $json );
        $httpConfig ['http'] ['content'] = $json;
    } else {
        $header = "Content-Type: text/html";
    }
    $httpConfig ['http'] ['header'] = $header;
    $context = stream_context_create ( $httpConfig );
    $stream = fopen ($url, 'r', false, $context);
    $result = stream_get_contents($stream);
    $headers = stream_get_meta_data($stream);
    fclose($stream);
    if (! $result) {
        print_r ( $data );
        var_dump ( $url );
        print_r ( $httpConfig );
        throw new Busca_Cxense_Exception_MethodCall ( "Bad call. \nString: $json\n" );
    }
    var_dump($result); exit;
    return array ('json' => json_decode ( $result ), 'string' => $result, 'headers' => $headers );
}

如您所见,它创建了一个上下文并打开了一个流。但是,我有一个非常奇怪的错误。如果我发送这个网址:

http://sandbox.cxsearch.cxense.com/api/search/levelup?p_aq=query%28category^1:%22preview%20trailer%22,token-op=or%29&p_sm=idobject:desc&p_s=0&p_c=20&p_dr=title

它会抛出一个错误的请求错误,但如果我发送另一个:

http://sandbox.cxsearch.cxense.com/api/search/levelup?p_q=test&p_sm=idobject:desc&p_s=0&p_c=20&p_dr=title

它按预期工作。我必须对网址进行编码吗?

已修复 我能够弄清楚问题所在。我只需要更改 %20 的空间。仅此而已……

【问题讨论】:

  • 您在这两个网址中发送的键/值对非常不同。您确定要在“工作”和“损坏”之间进行有效比较吗?苹果/橙子...
  • @MarcB 是的。这不是“非常”不同。在第一个我发送这个数据: $data->aq = array ('category' => array ('preview', 'trailer'));在第二个 $data->q = 'test';这些是不同类型的搜索,这就是它们不同的原因。系统工作正常,如果你进入他们预期的工作的网址,但从 PHP 他们没有。第一个抛出 400 错误
  • 我不知道您将查询发送到的系统允许什么,但乍一看,我会假设查询中的编码字符可能会抛出远程服务器的验证器。也许您无法发送包括括号之类的请求?
  • @EmmanuelG 我正在转换字符 tu utf8。最烦人的是,如果你从控制台运行: curl -XGET "sandbox.cxsearch.cxense.com/api/search/…trailer",token-op=or)&p_sm=idobject:desc&p_s=0&p_c=20&p_dr=title" 它会按预期工作......唯一的问题是通过 PHP 做的,无论是使用 fopen、get_file_contents 还是 curl

标签: php stream filestream httpcontext


【解决方案1】:

400 响应由远程服务器返回,因此您想查看规范/联系那一方的人员如何构建正确的查询。 您提供的 url 看起来非常不同,远程系统可能对值、提供的参数列表等有自己的验证规则。此外,它可能需要一些特定的标头和/或请求正文。

【讨论】:

  • 网址不是问题。正如我之前所说,如果我通过浏览器或控制台打开它们,它们可以正常工作,如果我尝试通过 PHP 运行它,第一个只会出错
  • >此外,它可能需要一些特定的标头和/或请求正文。
【解决方案2】:

我能够弄清楚问题所在。我只需要更改 %20 的空间。仅此而已……

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2021-07-15
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多