Фильтр для определения, был ли отправлен ответ :: json

#laravel #filter #laravel-4 #request #response

#laravel #Фильтр #laravel-4 #запрос #ответ

Вопрос:

У меня есть фильтр. Я хочу, чтобы этот фильтр действовал, только если на странице отображается HTML, а НЕ если это json или любой другой формат

 App::after(function($request, $response)
{
    if( $request->getMethod() == 'GET' amp;amp; $request->getRequestFormat() == 'html' ) {
        // do something!
    }
});
  

В моих функциях контроллера я возвращаю данные json:

 return Response::json($data);
  

Однако по- $request->getRequestFormat() прежнему равно «html», и этого не должно быть.

Я знаю, что могу установить формат ‘json’ следующим образом:

 Request::setRequestFormat('json');
return Response::json($data);
  

Но это кажется излишним. Если я возвращаю a Response::json , он должен знать, что это json, а не HTML. Как я могу определить, что это a Response::json ?

Ответ №1:

Формат запроса — это то, что не устанавливается автоматически — вы либо предоставляете его программно setRequestFormat , либо включаете параметр POST / GET _format .

Если вы хотите проверить, является ли запрос JSON, вы можете это сделать $request->isJson() , но мне кажется, что вы пытаетесь проверить, является ли ответ JSON? В этом случае вы можете сделать $response instanceof IlluminateHttpJsonResponse или $response->headers->get('Content-Type') == 'application/json'

Ответ №2:

Это вообще не a json , это HTML то, что содержит некоторые string внутри a div . Удалите div и просто передайте json using:

 return Response::json($data);
  

Затем на стороне клиента, используя jQuery синтаксический json анализ данных, создайте div и добавьте данные внутрь div , например, в вашей success callback попытке сделать что-то вроде этого:

 success(response) {
    // Parse the json if not parsed by jQuery
    var obj = $.parseJSON(response);
    if(obj.success) {
        $('<div/>', {id:"query-log"}).append(obj.data).appendTo('body');
    }
}
  

Это может быть неточно с вашими json данными, но, надеюсь, вы поняли идею, короче говоря, просто передайте json данные на сторону клиента и управляйте ими в браузере, используя jQuery .

Обновление: лучшим подходом было бы предоставить dataType при отправке запроса что-то вроде tgis:

 $.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: function( data ) {

    }
});
  

Также вы можете использовать это:

 $.getJSON( "url", function( data ) {
    // ...
});
  

Таким образом, заголовок запроса будет отправлен на сервер, и вы можете проверить, ожидает ли запрос json ответа, используя это:

 if($request->wantsJson()) {
    //
}
  

Это метод в классе запроса:

 /**
 * Determine if the current request is asking for JSON in return.
 *
 * @return bool
 */
public function wantsJson()
{
    $acceptable = $this->getAcceptableContentTypes();

    return isset($acceptable[0]) amp;amp; $acceptable[0] == 'application/json';
}
  

Комментарии:

1. Извините, я думаю, я был неясен. Вы делаете противоположное тому, что я хочу сделать. Я НЕ хочу, чтобы # запросов отображалось в JSON. Конечно <div> , это HTML, а не JSON. Я хочу определить, является ли ответ Json, чтобы я мог НЕ показывать # запросов

2. полностью игнорируйте <div> , это было несущественно. Я обновил вопрос

3. Спасибо, $request->wantsJSON() а затем установка типа данных в jQuery кажется мне самым чистым решением.

Ответ №3:

 App::after(function($request, $response)
{
    if( $request->getMethod() == 'GET' amp;amp; $request->getRequestFormat() == 'html' ) {

        // Test if response is JSON (PHP 5.3  needed for this)
        json_decode($response);
        if ( json_last_error() != JSON_ERROR_NONE ) {
            // Do something
        }
    }
});
  

Комментарии:

1. Вы меня неправильно поняли. Полностью игнорируйте <div> , это было несущественно. Я обновил вопрос

2. Обновленный ответ. Просто проверьте, является ли ответ действительным JSON или нет. Если это не так, предположим, что это должен быть HTML.