如何在$ ajax POST中传递参数?


135

我已经按照链接中所述的教程进行操作。在下面的代码中,由于某种原因,数据不会作为参数附加到url上,但是如果我使用/?field1="hello"它直接将它们设置为url 则可行。

$.ajax({
        url: 'superman',
        type: 'POST',
        data: { field1: "hello", field2 : "hello2"} ,
        contentType: 'application/json; charset=utf-8',
        success: function (response) {
            alert(response.status);
        },
        error: function () {
            alert("error");
        }
    }); 

8
如果您正在寻找要附加到URL的参数,则需要将类型更改为“ GET”。“ POST”将改为在HTTP标头中传递参数。

Answers:


126

对于简单的情况,我建议您使用jQuery 的$.post$.get语法:

$.post('superman', { field1: "hello", field2 : "hello2"}, 
    function(returnedData){
         console.log(returnedData);
});

如果您需要捕获失败案例,请执行以下操作:

$.post('superman', { field1: "hello", field2 : "hello2"}, 
    function(returnedData){
         console.log(returnedData);
}).fail(function(){
      console.log("error");
});

另外,如果您始终发送JSON字符串,则可以在最后使用$ .getJSON或$ .post以及另一个参数。

$.post('superman', { field1: "hello", field2 : "hello2"}, 
     function(returnedData){
        console.log(returnedData);
}, 'json');

1
较新版本的jQuery支持将$ .post和$ .get中的done(),fail()或always()处理程序“挂起”。请参阅:api.jquery.com/jQuery.post
Cyber​​Monk

什么是field1:什么"hello"?JS或PHP中的变量?
MTBthePRO

field1和field2是POST变量。Hello和Hello2是它们的值。
Alvaro

57

尝试使用GET方法,

var request = $.ajax({
    url: 'url',
    type: 'GET',
    data: { field1: "hello", field2 : "hello2"} ,
    contentType: 'application/json; charset=utf-8'
});

request.done(function(data) {
      // your success code here
});

request.fail(function(jqXHR, textStatus) {
      // your failure code here
});

您无法通过POST方法在URL中看到参数。

编辑:

弃用通知:从jQuery 3.0开始,删除了jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。您可以改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。


53

Jquery.ajax不会像对GET数据那样自动为您编码POST数据。jQuery希望您的数据经过预格式化,以附加到请求正文中,以直接通过网络发送。

一种解决方案是使用jQuery.param函数构建大多数处理POST请求的脚本期望的查询字符串。

$.ajax({
    url: 'superman',
    type: 'POST',
    data: jQuery.param({ field1: "hello", field2 : "hello2"}) ,
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    success: function (response) {
        alert(response.status);
    },
    error: function () {
        alert("error");
    }
}); 

在这种情况下,该param方法将数据格式化为:

field1=hello&field2=hello2

Jquery.ajax文档中说,有一个叫标志processData控制该编码是否是自动还是没有这样做。该文档说它默认为true,但这不是我在POST使用时观察到的行为。


7
我认为这是解释“为什么”的唯一答案。
zhouji

15
    function FillData() {
    var param = $("#<%= TextBox1.ClientID %>").val();
    $("#tbDetails").append("<img src='Images/loading.gif'/>");
    $.ajax({
        type: "POST",/*method type*/
        contentType: "application/json; charset=utf-8",
        url: "Default.aspx/BindDatatable",/*Target function that will be return result*/
        data: '{"data":"' + param + '"}',/*parameter pass data is parameter name param is value */
        dataType: "json",
        success: function(data) {
               alert("Success");
            }
        },
        error: function(result) {
            alert("Error");
        }
    });   
}

11

POST请求中,参数在请求的正文中发送,这就是为什么您在URL中看不到它们的原因。

如果您想看到它们,请更改

    type: 'POST',

    type: 'GET',

请注意,浏览器具有开发工具,可让您查看代码发出的完整请求。在Chrome浏览器中,它位于“网络”面板中。


8
$.ajax(
   {
      type: 'post',
      url: 'superman',
      data: { 
        "field1": "hello",
        "field2": "hello1"
      },
      success: function (response) {
        alert("Success !!");
      },
      error: function () {
        alert("Error !!");
      }
   }
);

type: 'POST',会将**参数附加到请求的正文中**(在URL 中看不到),而 将参数附加至可见的URL 。type: 'GET'

大多数流行的Web浏览器都包含显示完整请求的网络面板。

在网络面板中,选择XHR以查看请求

也可以通过这样做。

$.post('superman',
      { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      function (response) {
        alert("Success !");
      }
    );

6

您可以使用$ .ajax或$ .post

使用$ .ajax:

    $.ajax({
      type: 'post',
      url: 'superman',
      data: { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      success: function (response) {
        alert(response.status);
      },
      error: function () {
        alert("error");
      }
   });

使用$ .post:

    $.post('superman',
      { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      function (response, status) {
        alert(response.status);
      }
    );

非常感谢您-它的工作。不过,如果您可以添加一个示例来调用函数以获取post参数,那就太好了。谢谢!:)
gies0r

3

您的代码正确,只是您没有将JSON键作为字符串传递。

它周围应该有双引号或单引号

{“ field1”:“ hello”,“ field2”:“ hello2”}

$.ajax(
   {
      type: 'post',
      url: 'superman',
      data: { 
        "field1": "hello", // Quotes were missing
        "field2": "hello1" // Here also
      },
      success: function (response) {
        alert(response);
      },
      error: function () {
        alert("error");
      }
   }
);

0

对于POST方法中url中的send参数,您可以像下面这样简单地将其附加到url:

$.ajax({
    type: 'POST',
    url: 'superman?' + jQuery.param({ f1: "hello1", f2 : "hello2"}),
    // ...
}); 

2
如果发问者只想通过POST发送一些参数,则其他答案将更为合适,因为这将更为标准。该问题明确提到了POST和URL参数。(例如,我找到了这个问题,是因为我必须将URL参数与正文中的参数一起设置,并且我希望以比连接字符串更好的方式进行设置。)@ user4127将此作为答案或重新编写您的问题。
Jan Molnar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.