我有一个过滤器。我希望此过滤器仅在页面显示HTML时才会,如果是json或任何其他格式,则
App::after(function($request, $response)
{
if( $request->getMethod() == 'GET' && $request->getRequestFormat() == 'html' ) {
// do something!
}
});
在我的Controller函数中,我返回json数据:
return Response::json($data);
但是,$request->getRequestFormat()
仍然等于' html'它不应该是。
我知道我可以将格式设置为' json'像这样:
Request::setRequestFormat('json');
return Response::json($data);
但这似乎是多余的。如果我正在返回Response::json
,则应该知道它是json而不是HTML。如何检测到它是Response::json
?
答案 0 :(得分:3)
requestFormat是不会自动设置的 - 您可以通过setRequestFormat
或通过包含POST / GET参数_format
以编码方式提供它。
如果你想检查一个请求是否是JSON,你可以$request->isJson()
,但是对我来说更像是在尝试检查响应是否为JSON?在这种情况下,您可以$response instanceof Illuminate\Http\JsonResponse
或$response->headers->get('Content-Type') == 'application/json'
答案 1 :(得分:1)
这根本不是json
,HTML
string
内包含一些div
。删除div并使用:
json
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
在浏览器中操作它
更新:更好的方法是在使用tgis之类的内容时提供dataType
:
$.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]) && $acceptable[0] == 'application/json';
}