Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用$.ajax发送JSON而不是查询字符串?_Javascript_Jquery_Json_Query String - Fatal编程技术网

Javascript 如何使用$.ajax发送JSON而不是查询字符串?

Javascript 如何使用$.ajax发送JSON而不是查询字符串?,javascript,jquery,json,query-string,Javascript,Jquery,Json,Query String,有人能简单地解释一下如何让jQuery发送实际的JSON而不是查询字符串吗 $.ajax({ url : url, dataType : 'json', // I was pretty sure this would do the trick data : data, type : 'POST', complete : callback // etc }); 这实际上会将精心准备的JSON转换为查询字符串。其中一件恼人的事情是,

有人能简单地解释一下如何让jQuery发送实际的JSON而不是查询字符串吗

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});
这实际上会将精心准备的JSON转换为查询字符串。其中一件恼人的事情是,对象中的任何
数组[]
都将转换为
数组[]:[]:[]
,这可能是因为查询sting的限制。

您需要先使用将对象序列化为JSON,然后指定
contentType
,以便服务器理解它的JSON。这应该可以做到:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});
请注意,
JSON
对象在支持JavaScript 1.7/ECMAScript 5或更高版本的浏览器中本机可用。如果需要旧版支持,可以使用。

否,用于解析接收的数据

要发布JSON,您需要通过将
processData
选项设置为
false
来对其进行字符串化

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

请注意,并非所有浏览器都支持
JSON
对象,尽管jQuery有
.parseJSON
,但它没有包含stringifier;您将需要另一个polyfill库。

如果要将其发送回asp.net,并且需要request.form[]中的数据,则需要将内容类型设置为“application/x-www-form-urlencoded;charset=utf-8”

原职


其次,去掉数据类型,如果您不希望返回,那么POST将等待大约4分钟,然后失败。请参见

虽然我知道许多架构(如ASP.NET MVC)都有内置功能来处理JSON.stringify作为contentType,但我的情况有点不同,因此这可能对将来的人有所帮助。我知道这会节省我几个小时

由于我的http请求是由IBM(AS400环境)在不同子域上的CGIAPI处理的,因此这些请求是跨源的,因此是jsonp。实际上,我通过javascript对象发送ajax。下面是我的ajax帖子的一个示例:

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

这将不起作用,您缺少
contentType:'application/json'
@Ohgodwhy-Oh-yeah。这有点太快了;)谢谢我以为数据类型会处理这个,但我倒过来了。关于像Bergi在另一个答案中那样在内容类型中指定字符集,您有什么想法吗?@Redsandro,这应该是不必要的。根据jQuery文档:
POST数据将始终使用UTF-8字符集传输到服务器,根据W3C XMLHTTPRequest标准
@shorif2000,迟做总比不做好。。。问题是,在php中的
$\u POST
中,只能看到
应用程序/x-www-form-urlencoded
,如果要读取json数据,必须执行
文件获取内容(“php://input“
然后可能是
json\u decode()
数据类型与数据的发送方式无关。它只指定您希望调用返回的数据类型。如果要向服务器指示在
data
属性中指定的数据类型,则需要将
contentType
属性设置为类似于
contentType:“application/json”
,感谢您的澄清。但是在这种情况下,如果服务器在响应中提供内容类型头,为什么需要在客户端指定响应类型?您不必指定它,默认情况下jQuery将尝试根据响应的MIME类型进行智能猜测。但是,通过指定它,您可以显式地告诉jQuery您希望从服务器获得什么类型的响应,jQuery将尝试将响应转换为该类型的对象。不指定它并让jQuery猜测可能会导致jQuery将响应转换为意外的格式,即使您从服务器发送了JSON。有关数据类型的更多详细信息,请查看文档:设置
processData
false
的可能重复项是不必要的,因为
JSON.stringify
已返回字符串。@MarcusEkwall:Afaik它仍然是
encodeURIComponent
ed,不是吗?好的,可能不需要它,但是你真的认为它会使请求失败吗?考虑到它已经是一个字符串,它不应该使请求失败。@Redsandro:是的,它在做一个“智能猜测”。但是,使用该参数的原因不仅是人们希望将其严格化,更重要的是他们没有在服务器响应中设置适当的MIME类型。感谢您为这个问题添加更多知识!已经给出了令人满意的答案,但我投了你的一票。