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

Mar*_*cus 38 javascript ajax jquery jsonp http

我需要使用内容类型'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',
      });
Run Code Online (Sandbox Code Playgroud)

但是一旦我添加该行:contentType: "application/json"它开始将其作为OPTIONS请求而不是POST发送.

如何指定内容类型并仍然以POST方式提交请求?

SLa*_*aks 51

无法发出JSONP POST请求.

JSONP的工作原理是创建一个<script>从不同域执行Javascript 的标记; 无法使用<script>标记发送POST请求.

  • 是的,jQuery回退到XMLHttpRequest,因为你不能通过`<script>`包含POST.但这意味着JSONP响应永远不会起作用; 如果它来自不同的主机名,由于同源策略,您将无法从响应中读取任何内容.`<script>`包含只能触发`GET`,你要发送给它的任何数据都必须在URL查询参数中. (6认同)
  • 如果指定dataType:"jsonp"并键入"POST",则"jsonp"先于先例,并作为"GET"请求发送("POST"被忽略).好处是这样可以保留jsonp的功能,但是它是默认无法POST和GET(所以你必须要注意抓住它......) (2认同)

Pra*_*ani 7

使用jsondataType发送这样的:

        $.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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

并将这些行放在您的服务器端文件中:

如果是PHP:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
Run Code Online (Sandbox Code Playgroud)

如果java:

response.addHeader( "Access-Control-Allow-Origin", "*" ); 
response.addHeader( "Access-Control-Allow-Methods", "POST" ); 
response.addHeader( "Access-Control-Max-Age", "1000" );
Run Code Online (Sandbox Code Playgroud)