#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.