【发布时间】: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