我谦卑地来到人们面前寻求一些急需的帮助..
我正在使用(或尝试使用)skyscanner API - http://partners.api.skyscanner.net/apiservices/pricing/v1.0,如文档here所述。但是我遇到了这个错误:
HTTP请求失败! HTTP / 1.1 411所需长度
PHP尝试1
function getSkyScanner() {
$url = 'http://partners.api.skyscanner.net/apiservices/pricing/v1.0?apiKey=MY-API-KEY';
$headers = array( 'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/xml');
$contextData = array (
'method' => 'POST',
'header' => $headers);
$context = stream_context_create (array ( 'http' => $contextData ));
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { echo 'error'; }
var_dump($result);
}
我的服务器不支持cURL,因此我需要没有它的解决方案。我在WAMP中使用localhost,但我也尝试了一个实时版本,它出现了同样的错误和看似相同的问题。我已经尝试了几乎所有变量组合,以便以令人沮丧的成功量来纠正错误(无)。这是一个这样的变化,包括我试图发送的表单内容。
PHP尝试2
function getSkyScanner() {
$url = 'http://partners.api.skyscanner.net/apiservices/pricing/v1.0?apiKey=MY-API-KEY';
$params = array( 'country' => 'GB',
'currency' => 'GBP',
'locale' => 'en-GB',
'originplace' => 'LHR',
'destinationplace' => 'EDI',
'outbounddate' => '2016-10-10',
'adults' => '1'
);
$query = http_build_query($params);
$headers = array( 'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/xml');
$contextData = array (
'method' => 'POST',
'header' => $headers,
'content' => $query );
$context = stream_context_create (array ( 'http' => $contextData ));
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { echo 'error'; }
var_dump($result);
}
抛出:
未指定内容类型
其次是:
HTTP / 1.1 400错误请求
如果你能提供帮助,我现在会很感激一些见解。
非常感谢!
答案 0 :(得分:1)
您以错误的方式创建标头 - 而不是数组,标头应作为字符串传递。
$headers = "Content-Type: application/x-www-form-urlencoded\r\n" .
"Accept: application/xml\r\n";
您可以使用以下代码段创建正确的请求:
function prepare_headers($headers) {
return
implode('', array_map(function($key, $value) {
return "$key: $value\r\n";
}, array_keys($headers), array_values($headers))
);
}
function http_post($url, $data, $ignore_errors = false) {
$data_query = http_build_query($data);
$data_len = strlen($data_query);
$headers = array(
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/xml',
'Content-Length' => $data_len
);
$response =
file_get_contents($url, false, stream_context_create(
array('http' => array(
'method' => 'POST',
'header' => prepare_headers($headers),
'content' => $data_query,
'ignore_errors' => $ignore_errors
)
)
));
return (false === $response) ? false :
array(
'headers' => $http_response_header,
'body' => $response
);
}
http_post方法的示例用法:
$result = http_post('http://business.skyscanner.net/apiservices/pricing/v1.0', array(
'apiKey' => 'YOUR_API_KEY',
'country' => 'UK',
'currency' => 'GBP',
'locale' => 'en-GB',
'locationSchema' => 'iata',
'originplace' => 'EDI',
'destinationplace' => 'LHR',
'outbounddate' => '2016-10-10',
'adults' => '1'
), false);
http_post方法中的参数 $ ignore_errors 即使在失败状态代码(400,500等)上也可用于获取内容。如果您收到错误请求,请设置 ignore_errors = true - >您将收到服务器的完整回复。