如何使用getJSON,通过post方法发送数据?


107

我正在使用上述方法,并且与URL中的一个参数一起使用时效果很好。

例如Students/getstud/1,在应用控制器/动作/参数格式的地方。

现在,我在Students控制器中有一个动作,该动作接受两个参数并返回JSON对象。

那么如何$.getJSON()使用post方法发布数据?

类似的方法也是可以接受的。

关键是要用AJAX调用控制器的动作。


4
getgetJSON手段使用GET得到一些JSON。
Majid Fouladpour 2012年

1
@Majid Fouladpour当我问这个问题时,我不知道..!
维卡斯(Vikas)

Answers:


216

$ .getJSON()方法执行HTTP GET而不是POST。您需要使用$ .post()

$.post(url, dataToBeSent, function(data, textStatus) {
  //data contains the JSON object
  //textStatus contains the status: success, error, etc
}, "json");

在该调用中,dataToBeSent可以是任何您想要的东西,尽管如果要发送html表单的内容,则可以使用serialize方法从表单中为POST创建数据。

var dataToBeSent = $("form").serialize();

7
只是想添加$ .getJSON支持Jsonp(跨域访问),不幸的是$ .post不。
托马斯

2
实际上.getJSON()以两种方式支持跨域访问。JSONP,不使用GET或POST而是脚本注入;而且CORS-和.post()也支持CORS。但是,CORS要求服务器也支持它,而JSONP不支持。
hippietrail 2011年

2
并非如此,JSONP还需要服务器支持才能解析回调参数。
Shrulik 2013年

当我使用上面的函数时,我收到的是字符串对象而不是json对象。
Pratik Singhal

13

这是我的“单行”解决方案:

$.postJSON = function(url, data, func) { $.post(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }

为了使用jsonp和POST方法,此函数将“回调” GET参数添加到URL。这是使用它的方式:

$.postJSON("http://example.com/json.php",{ id : 287 }, function (data) {
   console.log(data.name);
});

服务器必须准备好处理回调GET参数,并返回json字符串,如下所示:

jsonp000000 ({"name":"John", "age": 25});

其中“ jsonp000000”是回调GET值。

在PHP中,实现方式如下:

print_r($_GET['callback']."(".json_encode($myarr).");");

我做了一些跨域测试,它似乎可以工作。虽然还需要更多测试。


1
这将永远不会绕过GET的限制,而POST的最大大小可以重新定义。
Dementic

为什么要添加?callback?在网址?这使得回调不被我调用。我还补充说JSON.stringify(data)。+1,有用的帖子!
尼卡比曹

@IonicăBizău:谢谢。为了返回对象,我们需要在URL上添加“回调”参数,服务器需要返回JQuery生成的相同对象名称。我还对getJSON()使用了覆盖函数:jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
lepe 2014年

7

只需将这些行添加到您的行中<script>(在加载jQuery之后但发布任何内容之前的某个位置):

$.postJSON = function(url, data, func)
{
    $.post(url, data, func, 'json');
}

更换(部分/全部)$.getJSON$.postJSON和享受!

您可以使用与相同的Javascript回调函数$.getJSON。无需服务器端更改。(好吧,我总是建议使用$_REQUEST的PHP。http://php.net/manual/en/reserved.variables.request.php其中$ _REQUEST,$ _GET和$ _POST哪一个是最快的?

这比@lepe的解决方案简单。


该方法不适用于通常可以应用于getJSON的done()和fail()方法。
HackWeight

3

我有正在做getJSON的代码。我只是将其替换为post。令我惊讶的是,它奏效了

   $.post("@Url.Action("Command")", { id: id, xml: xml })
      .done(function (response) {
           // stuff
        })
        .fail(function (jqxhr, textStatus, error) {
           // stuff
        });



    [HttpPost]
    public JsonResult Command(int id, string xml)
    {
          // stuff
    } 

3

我刚刚使用过,如果一个:

data = getDataObjectByForm(form);
var jqxhr = $.post(url, data, function(){}, 'json')
    .done(function (response) {
        if (response instanceof Object)
            var json = response;
        else
            var json = $.parseJSON(response);
        // console.log(response);
        // console.log(json);
        jsonToDom(json);
        if (json.reload != undefined && json.reload)
            location.reload();
        $("body").delay(1000).css("cursor", "default");
    })
    .fail(function (jqxhr, textStatus, error) {
        var err = textStatus + ", " + error;
        console.log("Request Failed: " + err);
        alert("Fehler!");
    });

1

$.getJSON()发送AJAX请求并取回JSON数据作为响应非常方便。las,jQuery文档缺少应该命名的姊妹函数$.postJSON()。为什么不仅仅使用它$.getJSON()并完成它呢?好吧,也许您想要发送大量数据,或者就我而言,IE7只是不想与GET请求一起正常工作。

是的,当前没有$.postJSON()方法,但是您可以通过在$.post()函数中指定第四个参数(类型)来完成相同的操作:

我的代码如下所示:

$.post('script.php', data, function(response) {
  // Do something with the request
}, 'json');

-8

如果只有两个参数,可以执行以下操作:

$.getJSON('/url-you-are-posting-to',data,function(result){

    //do something useful with returned result//
    result.variable-in-result;
});

5
我认为这不是所要求的答案。
Harmeet Singh'7
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.