是否可以对 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