我需要使用内容类型'application / json'创建一个jsonp POST请求。我可以像这样向服务器发送POST请求:
jQuery.ajax({
type: 'POST',
url: url,
data: data,
success: success,
error: error,
async: true,
complete: complete,
timeout: TIMEOUT,
scriptCharset: 'UTF-8',
dataType: 'jsonp',
jsonp: '_jsonp',
});
但是一旦我添加了行:contentType: "application/json"
,它就会开始将其作为OPTIONS请求发送而不是POST。
如何指定内容类型并仍将请求作为POST提交?
答案 0 :(得分:51)
无法发出JSONP POST请求。
JSONP的工作原理是创建一个<script>
标记,该标记从不同的域执行Javascript;无法使用<script>
标记发送POST请求。
答案 1 :(得分:7)
在json
中使用dataType
并发送如下:
$.ajax({
url: "your url which return json",
type: "POST",
crossDomain: true,
data: data,
dataType: "json",
success:function(result){
alert(JSON.stringify(result));
},
error:function(xhr,status,error){
alert(status);
}
});
并将这些行放在服务器端文件中:
如果 PHP :
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
如果 java:
response.addHeader( "Access-Control-Allow-Origin", "*" );
response.addHeader( "Access-Control-Allow-Methods", "POST" );
response.addHeader( "Access-Control-Max-Age", "1000" );
答案 2 :(得分:1)
有一个(黑客)解决方案我已经做了很多次,你可以用JsonP发布。 (您将能够发布表格,大于2000个字符,而不是GET可以使用的表格)
客户端应用程序Javascript
$.ajax({
type: "POST", // you request will be a post request
data: postData, // javascript object with all my params
url: COMAPIURL, // my backoffice comunication api url
dataType: "jsonp", // datatype can be json or jsonp
success: function(result){
console.dir(result);
}
});
<强> JAVA:强>
response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client
response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post
response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout
<强> PHP:强>
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
这样做,你打开你的服务器任何发布请求,你应该通过提供身份或其他东西来重新确保这一点。
使用此方法,您还可以将请求类型从jsonp更改为json,两者都有效,只需设置正确的响应内容类型
<强> JSONP 强>
response.setContentType( "text/javascript; charset=utf-8" );
<强> JSON 强>
response.setContentType( "application/json; charset=utf-8" );
请注意,您的服务器不会再尊重SOP(同源政策),但谁在乎?