Как Laravel знает Request:: needsJson - это запрос для JSON?

Я заметил, что Laravel имеет опрятный метод Request::wantsJson - я предполагаю, что когда я делаю запрос, я могу передать информацию, чтобы запросить ответ JSON, но как мне сделайте это и какие критерии использует Laravel для определения того, запрашивает ли запрос JSON?

Ответ 1

Он использует заголовок Accept, отправленный клиентом, чтобы определить, хочет ли он ответ JSON.

Посмотрите код:

public function wantsJson() {
    $acceptable = $this->getAcceptableContentTypes();
    return isset($acceptable[0]) && $acceptable[0] == 'application/json';
}

Итак, если клиент отправляет запрос с первым допустимым типом контента на application/json, тогда метод вернет true.

Как для запроса JSON, вы должны соответствующим образом установить заголовок Accept, это зависит от того, какую библиотеку вы используете для запроса маршрута, вот несколько примеров с библиотеками, которые я знаю:

Guzzle (PHP):

GuzzleHttp\get("http://laravel/route", ["headers" => ["Accept" => "application/json"]]);

cURL (PHP):

$curl = curl_init();
curl_setopt_array($curl, [CURLOPT_URL => "http://laravel/route", CURLOPT_HTTPHEADER => ["Accept" => "application/json"], CURLOPT_RETURNTRANSFER => true]);
curl_exec($curl);

Requests (Python):

requests.get("http://laravel/route", headers={"Accept":"application/json"})