当前位置: 首页 > 知识库问答 >
问题:

如何在不调用Chrome的CORS预检请求的情况下指定应用程序/json内容类型?

宫修贤
2023-03-14

根据fetch规范,只要指定了内容类型,即“应用程序/x-www-form-urlencoded”、“多部分/表单数据”或“文本/普通”中的一种,并且满足了其他条件,则POST请求不应导致飞行前请求。然而,在实践中,我很难以一种不会导致选项请求进行飞行前检查的方式指定用于获取的多个标头。

例1。

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: {
        "Content-Type": "text/plain, application/json",
        Accept: "application/json"
    },
    method: "POST",
    body: JSON.stringify({})
})

例2。

var myHeaders = new Headers();
myHeaders.append('Accept', 'application/json');
myHeaders.append('Content-Type', 'text/plain');
myHeaders.append('Content-Type', 'application/json');

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: myHeaders,
    method: "POST",
    body: JSON.stringify({})
})

ex 3.

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: [
        ["Content-Type", "application/json"],
        ["Content-Type", "text/plain"],
        ["Accept", "application/json"]
    ],
    method: "POST",
    body: JSON.stringify({})
    })

这两个示例都无法在没有飞行前请求的情况下成功地进行请求,但只使用指定了其中一个:“Content Type”:“text/plain”似乎可以正常工作。然而,这里的示例显示了在请求中指定这两者,并建议它不应导致预飞行。这只是不同浏览器实现的问题,还是我遗漏了什么?

共有1个答案

夹谷星纬
2023-03-14

看起来我可能没有仔细阅读那篇参考文献。下面是重要的摘录。

警告这有意不使用提取MIME类型,因为该算法相当宽容,而且服务器不需要实现它。

如果使用了提取MIME类型,则以下请求不会产生CORS预飞行,服务器上的天真解析器可能会将请求正文视为JSON

看起来我们在很大程度上受限于mime类型Application/x-www-form-urlencodedmultipart/form-datatext/平原以避免对CORS的预飞行请求。

参考:

  • https://fetch.spec.whatwg.org/#example-cors安全列表请求标头内容类型
 类似资料:
  • 问题内容: 我有一个烧瓶应用程序,具有以下视图: 但是,这仅在请求的内容类型设置为时才有效,否则dict 为None。 我知道请求主体为字符串,但我不想每次客户端忘记设置请求的内容类型时都将其解析为字典。 有没有办法假设每个传入请求的content- type是?我想要的就是始终访问有效的字典,即使客户端忘记将应用程序的内容类型设置为json。 问题答案: 使用并设置为: 从文档中: 默认情况下,

  • 问题内容: 我有一个带有GET处理程序的简单控制器,该处理程序接受一个对象来绑定请求参数: 这是一个简单的POJO类: 一切正常,但我想摆脱设置者,使该对象不可变为公共使用。在Spring 5.0.2 之前的处理程序方法文档中,我们了解到可能的有效方法参数是: 命令或表单对象将请求参数绑定到Bean属性(通过设置器) 或直接 绑定 到字段 是否可以以某种方式覆盖默认的Spring Boot配置,以

  • 问题内容: 如何在Java程序中打开和关闭调试?如何在不重新编译Java程序的情况下打开和关闭调试? 问题答案: 无需使用IDE进行调试 1)您可以使用Assertions编写Java程序。您随时可以启用/禁用它们。 2)您可以使用配置了log4j.properties的日志。在Java程序中,您可以随时指定信息和调试日志,只要您想显示调试或信息日志等信息,就可以在log4j.properties

  • 问题内容: 我有一个定义自己的枚举的类,如下所示: 如果指定MyEnum.E1,它可以正常工作,但我真的很想将其作为“ E1”。您知道如何实现此目的,还是必须在另一个文件中定义它才能起作用? 结论:我无法正确获取导入的语法。由于有几个答案表明这是可能的,因此我将选择一个为我提供所需语法的文件,并对其他文件进行投票。 顺便说一下,这是一个真正的STRANGE部分(在我执行静态导入之前),我编写的使用

  • 问题内容: 有什么方法可以避免在初始化类时调用类,例如从类方法中调用? 我试图在Python中创建一个不区分大小写和标点符号的字符串类,以进行有效的比较,但是在不调用的情况下创建新实例时遇到了麻烦。 我应该替换为什么以用切片初始化新对象? 编辑: 受到以下答案的启发,已对初始化程序进行了编辑,以快速检查是否没有参数。 问题答案: 在此示例中,使用元类提供了一个不错的解决方案。元类的用途有限,但效果