如何使用 jQuery 发出指定 contentType 的 jsonp POST 请求?

IT技术 javascript jquery ajax http jsonp
2021-02-06 09:39:45

我需要使用内容类型“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个回答

无法发出 JSONP POST 请求。

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

如果我省略 contentType,则会发出请求,服务器将其作为 POST 获取。
2021-04-05 09:39:45
是的,jQuery 回退到 XMLHttpRequest,因为您不能通过<script>包含进行POST 但这意味着 JSONP 响应永远不会起作用;如果它来自不同的主机名,由于同源策略,您将无法从响应中读取任何内容。<script>包含只能触发 a GET,您要发送给它的任何数据都必须包含在 URL 查询参数中。
2021-04-09 09:39:45
如果您指定 dataType: "jsonp" 并键入 "POST",则 "jsonp" 优先并作为 "GET" 请求发送("POST" 被忽略)。好处是这保留了 jsonp 功能,缺点是它默默地无法 POST 和 GETs(所以你必须真正注意捕捉它......)
2021-04-12 09:39:45

使用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);
            }
        });

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

如果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" );
这是否涉及安全问题?
2021-03-26 09:39:45

有一个(hack)解决方案我已经做过很多次了,你将能够使用 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');

这样做,您正在向任何发布请求打开您的服务器,您应该通过提供 ident 或其他东西来重新保护它。

使用这个方法,你也可以将请求类型从 jsonp 改为 json,都可以,只要设置正确的响应内容类型

jsonp

response.setContentType( "text/javascript; charset=utf-8" );

json

response.setContentType( "application/json; charset=utf-8" );

请注意,您的服务器将不再遵守 SOP(同源政策),但谁在乎呢?

我认为您所说的实际上是在使用 CORS。通过设置这些标头,您将触发客户端发起 CORS 请求。我不一定会将其描述为“黑客”;应该这样做。此外,我不建议使用“*”,而是回显客户端的来源并在服务器上进行白名单检查。有关更多详细信息,请参见此处:enable-cors.org/server.html
2021-04-14 09:39:45