如果请求要求JSON,Laravel中有三种不同的方法.它们是一样的吗?有任何重叠吗?

mut*_*ity 3 ajax controller laravel

因此,如果请求是针对JSON的,那么这三种方法都在Laravel文档中进行测试.

我基本上想要为请求JSON或AJAX的任何请求返回JSON.

Request::ajax() Request::isJson() Request::wantsJson()

我可以使用这些吗?它们是否重叠?

Ohg*_*why 7

并非所有AJAX请求都需要JSON响应,因此request()->ajax()在您想要确定请求是否为a XmlHttpRequest,但响应不关​​心JSON的情况下,利用是有用的.

并非所有包含JSON的请求都需要JSON响应.因此,如果您不关心响应是否需要JSON,但想要确定JSON是否在请求中发送,那么isJson()对您有用.

并非所有需要JSON响应的请求都是由AJAX驱动的,因此wantsJson在您想要返回JSON数据的情况下非常有用,但您并不关心请求如何到达您的服务器.

根据这些描述,进行断言并选择适当的函数.


Joh*_*ith 3

对于 2023 年访客:

\n

长话短说

\n
    \n
  • ajax()只检查调用方法request,不检查格式。和request可以response是任何类型。

    \n
  • \n
  • isJson()仅检查request. 必须request是 JSON 格式,但response可以是任何类型。

    \n
  • \n
  • wantsJson()仅检查response. 必须response是 JSON 格式,但request可以是任何类型。

    \n
  • \n
  • 对于expectsJson(),请阅读全文。此方法有一个故事,使Mustafa Ak\xc3\xa7akaya\ 的答案和MR_AMDEV\ 的答案不完整或不正确。

    \n
  • \n
\n

Laravel 10文档和方法定义可能会令人困惑,尤其是在使用wantsJson().

\n

使用这些函数时必须小心,因为输出可能True在 Postman 中,但False在浏览器中。

\n

ajax()1

\n
    \n
  1. 确定是否request是 AJAX 调用的结果。
  2. \n
  3. 它仅涉及request.
  4. \n
  5. 必须request是 类型XMLHttpRequest,表示 AJAX 调用。
  6. \n
  7. 如果像jQueryAxios这样的 JavaScript 库设置了一个 AJAX 请求X-Requested-WithHTTP 标头,则这是一个 AJAX 请求。
  8. \n
  9. 只有这个标头是必需的,因此您可以手动将该标头添加或合并到您的request.
  10. \n
  11. 该方法与格式或无关response
  12. \n
\n

isJson()2

\n
    \n
  1. 确定是否request正在发送 JSON。
  2. \n
  3. 这都是关于格式化request.
  4. \n
  5. 为了确保格式正确,它会在content-type header中查找/json OR+json
  6. \n
\n

wantsJson()3

\n
    \n
  1. 确定当前是否正在request请求 JSON 作为response.
  2. \n
  3. 这都是关于response.
  4. \n
  5. 在 中response ,必须将其设置accept标头。
  6. \n
  7. 如果accept标头已预设并填充(已设置)并且[包含/json OR +json ],则返回 true。
  8. \n
\n

expectsJson()4

\n
    \n
  1. 确定当前请求是否需要 JSON 响应。
  2. \n
  3. 它在两种不同的条件下返回 true。
  4. \n
\n
    \n
  • 检查是否request是 ajax AND不是 pjax AND接受任何内容类型。所以,在这种情况下,response可能是任何东西。
  • \n
  • 或者wantsJson()
  • \n
\n
    \n
  1. 可能与request.
  2. \n
  3. 可能与response.
  4. \n
  5. 在 中response它可以被设置accept标题。
  6. \n
  7. 如果accept设置了标头,则它可以包含任何内容类型。
  8. \n
\n

请让我知道,如果你有任何问题。

\n