过滤以检测是否已发送Response :: json

时间:2014-06-13 19:20:08

标签: laravel filter laravel-4 request response

我有一个过滤器。我希望此过滤器仅在页面显示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

2 个答案:

答案 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)

这根本不是jsonHTML 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';
}