是否可以对 application/json 进行跨域 POST ajax 请求?

Posted

技术标签:

【中文标题】是否可以对 application/json 进行跨域 POST ajax 请求?【英文标题】:Is is possible to make a cross domain POST ajax request of application/json? 【发布时间】:2012-08-21 09:31:24 【问题描述】:

我正在测试一些 csrf 的东西,我想知道是否可以使用 Content-Type: application/json 发布跨域 ajax 请求

每次我尝试用 jQuery 来做这件事时:

  $.ajax(
    type: "post",
    url: "http://someotherdomain.com/endpoint",
    contentType: "application/json; charset=UTF-8",
    data: "a": "1",
    dataType: "json",
    crossDomain: true,
    success: function(data) alert(data); , 
    failure: function(data) alert(data); 
  );

我总是发送 HTTP OPTIONS 请求而不是 HTTP POST

注意-我不关心接收数据,我只需要一个单向的帖子。

注意 - 内容类型不能是 x-www-form-urlencoded 也不能是 GET 请求。

【问题讨论】:

【参考方案1】:

如果您的浏览器支持所谓的跨域资源共享 (CORS) 和all modern browsers,则可能现在支持此功能。简而言之,服务器应该为您提供Access-Control-Allow-Origin 标头。

另外,正如您所说,您不必费心获取任何信息作为回复,您为什么不提交一些表格?

【讨论】:

服务器只接受application/json请求,我对服务器没有控制权。所以我不能让服务器提供任何标题也不能提交表单。还有其他选择吗? @JarrodEverett,那么看起来 CORS 是最好的解决方案,当然,如果服务器可以返回这样的标头。否则,我建议在您身边有一个代理来添加该标题。但问题是 - 如果你有代理,你不必担心这些跨域问题))) 这可能与flash有关吗? 不知道那种程度的动作脚本,但我怀疑。无论如何,即使可能,从 javascript 角度来看,这将是另一种代理,而不是最好的。【参考方案2】:

Content-Type: application/json 标头不是一个简单的标头,因此在实际请求之前首先需要一个预检请求。您看到的 HTTP OPTIONS 请求是预检请求。来自 CORS 规范 (http://www.w3.org/TR/cors/):

如果标题字段名称是 Accept、Accept-Language 或 内容语言,或者如果它是不区分大小写的 ASCII 匹配 Content-Type 和头域值媒体类型(不包括 参数)是一个不区分大小写的 ASCII 匹配 application/x-www-form-urlencoded、multipart/form-data 或 text/plain。

为了通过预检请求,服务器需要使用以下标头响应 OPTIONS 请求:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Content-Type

一旦浏览器收到此响应,它将发出实际的 HTTP POST 请求。请注意,如果您的请求包含其他自定义标头,则需要将它们包含在 Access-Control-Allow-Headers 响应标头中。您可以在此处了解有关 CORS 预检请求的更多信息:

http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

【讨论】:

很好的答案,一个经常被忽视的微妙点。我想知道当 GET application/json 不是时如何允许 GET text/plain 绕过 CORS。是否有一种简单/优雅/很大程度上受支持的方式来接收请求中内容类型为纯文本/文本的 JSON?

以上是关于是否可以对 application/json 进行跨域 POST ajax 请求?的主要内容,如果未能解决你的问题,请参考以下文章

application/json-p text/json-p 已经可以实现了吗?

表格 enctype "application/json" 可用吗?

如何使用 fetch 发布内容类型为 application/json

Python请求模块:对json数据进行urlencoding

CORS请求,Content-Type:application / json

关于java的接口的一些规范