2017-04-15 29 views
2

PHPとLaravelという問題があります。私は、リモートULRからJSONファイルを読み込むしようとしています:PHPはリモートURLからJSONファイルを読み込みます

https://services.realestate.com.au/services/listings/search?query={"channel":"buy","filters":{"propertyType":["house"],"surroundingSuburbs":"False","excludeTier2":"true","geoPrecision":"address","localities":[{"searchLocation":"Blacktown, NSW 2148"}]},"pageSize":"100"}

私は、コードを使用:

$re_url = 'https://services.realestate.com.au/services/listings/search?query={"channel":"buy","filters":{"propertyType":["house"],"surroundingSuburbs":"False","excludeTier2":"true","geoPrecision":"address","localities":[{"searchLocation":"Blacktown, NSW 2148"}]},"pageSize":"100"}'; 

$ch = curl_init($re_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$re_str = curl_exec($ch); 
curl_close($ch); 
$re_list = json_decode($re_str); 

それはあなたの要求を処理中にエラーが発生しました」エラーを受信まま#30.96464868を参照します。 .1492255689.1829cf2 "

https://google.com.au」というURLを試してみましたが、うまくいきましたので、URLエンコードの問題のようです。確信はないけど。

誰でも手助けできますか、同じ問題がありましたか?

おかげ

答えて

2

私はあなたに2つの問題があり、下のコードがそれらを解決すると信じています。私のコードもをに、いくつかの異なる方法を使用してJSONの手動アセンブリを避けるため、URLのクエリ文字列など(提供されたコードの行3-41を参照)

問題

  1. あなたはありませんクエリパラメータ値をエンコードすることは、urlencodeのparam値で固定できますが、私は入門の段落で述べた理由でhttp_build_queryを好んでいます。
  2. ユーザーエージェント(UA)ヘッダーを送信していません(遠端にはこのヘッダーの値が必要ですが、それは気にしません)。UAで要求を受信したので、IPのホワイトリストを作成する必要があります。あなたのホワイトリストがいつタイムアウトするかを決して知らないので、毎回のリクエストでそれを送信します。私は、私はこのスクリプトで設定したもののためにライン50-53を参照し、いくつかのオプションは、あなたはさておきとして、

    <?php 
    
    /* 
    * The data that will be serialized as JSON and used as the value of the 
    * `query` parameter in your URL query string 
    */ 
    $search_query_data = [ 
        "channel" => "buy", 
        "filters" => [ 
         "propertyType" => [ 
          "house", 
         ], 
         "surroundingSuburbs" => "False", 
         "excludeTier2" => "true", 
         "geoPrecision" => "address", 
         "localities" => [ 
          [ 
           "searchLocation" => "Blacktown, NSW 2148", 
          ], 
         ], 
        ], 
        "pageSize" => "100", 
    ]; 
    
    /* 
    * Serialize the data as JSON 
    */ 
    $search_query_json = json_encode($search_query_data); 
    
    /* 
    * Make a URL query string with a param named `query` that will be set as the 
    * JSON from above 
    */ 
    $url_query_string = http_build_query([ 
        'query' => $search_query_json, 
    ]); 
    
    /* 
    * Assemble the URL to which we'll make the request, and set it into CURL 
    */ 
    $request_url = 'https://services.realestate.com.au/services/listings/search?' . $url_query_string; 
    
    $ch = curl_init($request_url); 
    
    /* 
    * Set some CURL options 
    */ 
    // Have `curl_exec()` return the transfer as a string instead of outputting 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    // Set a user agent header 
    curl_setopt($ch, CURLOPT_USERAGENT, 'H.H\'s PHP CURL script'); 
    // If you want to spoof, say, Safari instead, remove the last line and uncomment the next: 
    //curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30'); 
    
    /* 
    * Get the response and close out the CURL handle 
    */ 
    $response_body = curl_exec($ch); 
    curl_close($ch); 
    
    /* 
    * Unserialize the response body JSON 
    */ 
    $search_results = json_decode($response_body); 
    

    最後に説明のコメントで

置換コード

を持っていますCURLを直接使用することをやめ、ライブラリを使用してHTTPのやりとりの一部を抽象化し、リクエスト/レスポンスを「標準」(PSR)インターフェイスでよりうまく開始できるようにすることをお勧めします。Laravelを使用しているので、すでにComposerを使用してエコシステムに入っているので、簡単にinstall something like Guzzleできます。

+1

ありがとうございました。 –

+1

Tried Guzzle、それは素晴らしいです。はるかに簡単でコーディングが少なくて済みます。 –

+0

恐ろしい!あなたがチェックアウトしてうれしいです! – JAAulde

0

私はあなたが最初のものは、あなたが後に()でurlencodeすることは非常に簡単でなければならないのさ

を克服する必要があることをここに2つの問題があるかもしれないGUESS「検索?」 、彼らがしようとすると、一部の特殊文字がちょうどURLへの直接パス

それはまだ動作しない場合でurlencode後の第二の問題は、あなたがサービスに送信される方法 で、私はいくつかのAPIを使用して行っていることはできませんJsonを送信すると、彼らは一般的に身体に入れ、 "POST"します。あなたがURLで(初めから)それらを渡すべきではないかもしれません。もちろん、それがまだ機能していない場合は、これを考慮する必要があります。

クロムの郵便配達員を最初にお試しください、あなたはそれを愛するでしょう。

+0

urlencode()を試してもうまくいきませんでした。エラーは "あなたはこのサーバー上の/ services/listings/searchにアクセスする権限がありません"です。私は郵便配達員に生のURLを貼り付けました。そこにはうまくいきます。 –

+0

それはブラウザで働き、郵便配達で働いていましたが、PHPコードからではありませんでした。 –

+0

クエリ文字列全体を 'urlencode'したいだけで、パラメータ値だけにする必要はありません。あなたが指定したURLの例では、 'query =' – JAAulde

0
$_curl = curl_init(); 
curl_setopt($_curl, CURLOPT_SSL_VERIFYHOST, 2); // you missing this line 
curl_setopt($_curl, CURLOPT_SSL_VERIFYPEER, false); // you missing this line 
curl_setopt($_curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($_curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($_curl, CURLOPT_URL, $re_url); 
$rtn = curl_exec($_curl); 
関連する問題