2016-10-03 2 views
0

を必要と失敗した。..HTTPリクエストは、長さが、私は謙虚にこれでいくつかの多くの必要な支援を人々の前に来る

私が使用して(または使用しようとして)いますスカイスキャナーのAPI - http://partners.api.skyscanner.net/apiservices/pricing/v1.0を文書としてhere。しかし、私は、このエラーに直面して来ています:私はそれなしでソリューションを必要としてるよう

HTTP request failed! HTTP/1.1 411 Length Required

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); 
} 

私のサーバーは、カールをサポートしていません。私はWAMPとlocalhostを使用していますが、同じエラーと一見同じ問題が発生するライブバージョンも試しました。私は、不合理な量の成功(なし)でエラーを修正するために、ほとんどすべての変数の組み合わせを試しました。これは、送信しようとしているフォームの内容を含むバリエーションの1つです。

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); 
} 

これはアウトスロー:

Content-type not specified

が続く:

HTTP/1.1 400 Bad Request

あなたは私が右について今、いくつかの洞察力をいただければ幸い助けることができる場合。

多くの感謝!

+0

1.ご要望に応じてコンテンツ/フォームデータを送信しているようではありません。リンクしたドキュメントには、送信が必要なフィールドが指定されています。 2.送信するデータのサイズにContent-Lengthヘッダーを含める必要があります。 –

+0

@マークH - ご意見ありがとうございます。明確にするために、すでに調査したオプションを強調するために投稿を編集しました。 1.私の2回目の試み(上記)で見ることができるフォームデータに関する公正なポイント。 2.また、さまざまなContent-Lengthヘッダを試しましたが、役に立たないものです。それ以上の考え? –

答えて

1

間違った方法でヘッダーを作成する - 配列の代わりにヘッダーを文字列として渡す必要があります。

$headers = "Content-Type: application/x-www-form-urlencoded\r\n" . 
      "Accept: application/xml\r\n"; 

あなたは正しい要求を作成するために、スニペットの下に使用することができます。HTTP_POSTの

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); 

パラメータ$ IGNORE_ERRORSはフェッチのためreponsibleです障害ステータスコード(400,500など)であっても内容を保持します。 不正なリクエストを受け取った場合は、ignore_errors = true->サーバーからの完全な応答を受信します。

+0

ありがとうございました。私は以来、WAMP内でCURLを有効にすることができました。これで私のサーバー上でCURLが有効になりましたので、これを実装しました。これはバグの発生が少なくなります。しかし、あなたが答えに時間を取っていたので、私はそれをチェックする礼儀をしたかった。したがって、このコードを実行すると、サーバーが場所ヘッダーにリダイレクトするため、** 403 Forbidden **エラーが表示されます(このエラーを無視すると、エラーは無視されます)。また、スカイスキャナーのドキュメントでは、 apiKeyを使って..continued below –

+0

CURLによってこのリダイレクトが防止され、apiKeyをURLに追加できるようになりましたが、CURLを使用せずに行う方法がわかりません。あなたの答えに対する私の答えは、動作しているかどうかわかりませんが、この方法で正しい行にいるかのように見えます。本当のテストは、リダイレクトを防ぐことでヘッダーの応答を見ることです。しかし、最も必要とされたときに電話に注意を払うこの努力のために、あなたは私からupvoteを得る! –

+0

このコード部分を置き換えました** 'apiKey' => 'YOUR_API_KEY'、**適切なapiKeyで** – PiKos

関連する問題