Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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()-是否向POST请求添加查询参数?_Javascript_Jquery_Json_Ajax - Fatal编程技术网

Javascript ajax()-是否向POST请求添加查询参数?

Javascript ajax()-是否向POST请求添加查询参数?,javascript,jquery,json,ajax,Javascript,Jquery,Json,Ajax,要使用jQuery AJAX向url添加查询参数,请执行以下操作: $.ajax({ url: 'www.some.url', method: 'GET', data: { param1: 'val1' } )} 这会产生一个类似于www.some.url?param1=val1 当方法为POST时,如何执行相同的操作?在这种情况下,数据不再作为查询参数追加,而是构成请求的主体 我知道我可以在ajax请求之前手动将参数附加到url,但我有一种烦人的感觉,就是我缺少一

要使用jQuery AJAX向url添加查询参数,请执行以下操作:

$.ajax({
  url: 'www.some.url',
  method: 'GET',
  data: {
      param1: 'val1'
  }
)}
这会产生一个类似于
www.some.url?param1=val1

当方法为POST时,如何执行相同的操作?在这种情况下,
数据
不再作为查询参数追加,而是构成请求的主体

我知道我可以在ajax请求之前手动将参数附加到url,但我有一种烦人的感觉,就是我缺少一些明显的方法来实现这一点,这比ajax调用之前需要执行的~5行要短。

允许您将对象的属性序列化为查询字符串,您可以自己将其附加到URL:

$.ajax({
  url: 'http://www.example.com?' + $.param({ paramInQuery: 1 }),
  method: 'POST',
  data: {
    paramInBody: 2
  }
});

感谢@Ates Goral提供的
jQuery.ajaxPrefilter()
提示。我的问题是我无法更改
url
,因为它绑定到
kendoGrid
,并且后端web API不支持
kendoGrid
的服务器分页选项(即
页面
页面大小
跳过
获取
)。此外,后端分页选项必须是不同名称的查询参数。因此,必须在
数据中放入一个属性来触发预过滤

var grid = $('#grid').kendoGrid({
    // options here...
    dataSource: {
        transport: {
            read: {
                url: url,
                contentType: 'application/json',
                dataType: 'json',
                type: httpRequestType,
                beforeSend: authentication.beforeSend,
                data: function(data) {
                  // added preFilterMe property
                  if (httpRequestType === 'POST') {
                      return {
                          preFilterMe: true,
                          parameters: parameters,
                          page: data.page,
                          itemsPerPage: data.pageSize,
                      };
                  }

                  return {
                      page: data.page,
                      itemsPerPage: data.pageSize,
                  };
              },
          },
        },
    },
});
如您所见,
transport.read
选项与
jQuery.ajax()的选项相同。在预滤波位中:

$.ajaxPrefilter(function(options, originalOptions, xhr) {
    // only mess with POST request as GET requests automatically
    // put the data as query parameters
    if (originalOptions.type === 'POST' && originalOptions.data.preFilterMe) {
        options.url = options.url + '?page=' + originalOptions.data.page 
            + '&itemsPerPage=' + originalOptions.data.itemsPerPage;

        if (originalOptions.data.parameters.length > 0) {
            options.data = JSON.stringify(originalOptions.data.parameters);
        }
    }
});

很好的一点,正如被问到的,它几乎是重复的,但我在写问题时犯了一个错误——我真正应该问的不是“当contentType是application/json时”,而是“当方法是POST时”。我会更新这个问题。如果基本url没有参数,这是一个不可靠的解决方案,那么这个问题就可以解决。当然,我可以使用
$.param()
创建查询字符串,然后执行类似
url+=(url.match(/\?/)?'&':'?')+queryString的操作
可以安全地附加查询字符串,但这会成为一个可怕的单行代码,或者在实际调用ajax之前,我必须准备好url。这当然是有效的,但并不理想。如果有人没有更好的建议,我会接受。您可以介绍自己的属性,
query
,并将其作为选项包含在您的
$.post()
调用中。然后编写一个脚本,在幕后进行令人讨厌的查询字符串操作,而不使用代码的其余部分。自定义参数+预过滤器对我来说似乎是最整洁的。@fildred13请发布您的解决方案好吗?我有同样的情况:向
$.post.添加GET参数
,但URL有时已经有GET参数,有时没有,因此
URL:getMyUrl+'?'+$.param({paramInQuery:1}),
在任何情况下都不起作用。