如何使用jQuery创建指定contentType的jsonp POST请求?

时间:2010-10-05 00:28:27

标签: javascript jquery ajax http jsonp

我需要使用内容类型'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提交?

3 个答案:

答案 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(同源政策),但谁在乎?