我相信你有兩個問題,我的代碼將在下面解決它們。我的代碼還採用了一些不同的方法來JSON的避免手工裝配,URL查詢字符串,等等(見行所提供的代碼的3-41)
問題
- 你是不是對查詢參數值進行編碼 - 可以用參數值的
urlencode
固定,但我更喜歡http_build_query
,原因在於我的介紹性段落中提到的原因。
- 你沒有發送用戶代理(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。
非常感謝,精彩的工作。 –
試過Guzzle,太棒了。更容易和更少的編碼。 –
太棒了!我很高興你檢查出來了! – JAAulde