HTTP请求失败所需的长度

时间:2016-10-03 16:34:20

标签: php api httprequest

我谦卑地来到人们面前寻求一些急需的帮助..

我正在使用(或尝试使用)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错误请求

如果你能提供帮助,我现在会很感激一些见解。

非常感谢!

1 个答案:

答案 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 - >您将收到服务器的完整回复。