Làm thế nào để sử dụng getJSON, gửi dữ liệu với phương thức post?


107

Tôi đang sử dụng phương pháp trên và nó hoạt động tốt với một tham số trong URL.

ví dụ: Students/getstud/1nơi áp dụng định dạng bộ điều khiển / hành động / tham số.

Bây giờ tôi có một hành động trong bộ điều khiển Students chấp nhận hai tham số và trả về một đối tượng JSON.

Vậy làm cách nào để đăng dữ liệu với $.getJSON()using post method?

Các phương pháp tương tự cũng được chấp nhận.

Vấn đề là gọi một hành động của bộ điều khiển với AJAX.


4
gettrong getJSONphương tiện sử dụng GET để có được một số json.
Majid Fouladpour

1
@Majid Fouladpour Khi tôi hỏi câu hỏi này, tôi không biết rằng ..!
Vikas

Câu trả lời:


216

Phương thức $ .getJSON () thực hiện HTTP GET chứ không phải POST. Bạn cần sử dụng $ .post ()

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

Trong lệnh gọi đó, dataToBeSentcó thể là bất kỳ thứ gì bạn muốn, mặc dù nếu đang gửi nội dung của một biểu mẫu html, bạn có thể sử dụng phương pháp tuần tự hóa để tạo dữ liệu cho ĐĂNG từ biểu mẫu của mình.

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

7
Chỉ muốn thêm $ .getJSON hỗ trợ Jsonp (truy cập tên miền chéo), tiếc là $ .post không.
Tomas

2
Trên thực tế, .getJSON () hỗ trợ truy cập tên miền chéo theo hai cách. JSONP, không sử dụng GET hoặc POST nhưng chèn tập lệnh; mà còn CORS - và .post () cũng hỗ trợ CORS. Tuy nhiên CORS yêu cầu máy chủ cũng hỗ trợ nó trong khi JSONP thì không.
hippietrail

2
Không đúng, JSONP cũng yêu cầu máy chủ hỗ trợ để phân tích cú pháp tham số gọi lại.
Shrulik,

Khi tôi đang sử dụng hàm trên, tôi đang nhận một đối tượng chuỗi thay vì một đối tượng json.
Pratik Singhal

13

Đây là giải pháp "một dòng" của tôi:

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

Để sử dụng jsonp và phương thức POST, hàm này sẽ thêm tham số GET "gọi lại" vào URL. Đây là cách để sử dụng nó:

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

Máy chủ phải được chuẩn bị để xử lý tham số GET gọi lại và trả về chuỗi json như sau:

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

trong đó "jsonp000000" là giá trị GET gọi lại.

Trong PHP, việc triển khai sẽ như sau:

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

Tôi đã thực hiện một số thử nghiệm tên miền chéo và nó có vẻ hoạt động. Tuy nhiên, vẫn cần thêm thử nghiệm.


1
Điều này sẽ không bao giờ vượt qua giới hạn mà GET có trong khi kích thước tối đa của POST có thể được xác định lại.
Dementic

Tại sao bạn lại thêm ?callback? trong url? Điều đó khiến cuộc gọi lại không được gọi cho tôi. Tôi cũng nói thêm JSON.stringify(data). +1, bài viết hữu ích!
Ionică Bizău

@ IonicăBizău: cảm ơn. Để trả về một đối tượng, chúng ta cần thêm tham số "callback" vào URL và máy chủ cần trả về cùng một tên đối tượng do JQuery tạo ra. Tôi cũng sử dụng một chức năng ghi đè cho getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
Lepe

7

Chỉ cần thêm những dòng này vào của bạn <script>(ở đâu đó sau khi jQuery được tải nhưng trước khi đăng bất cứ thứ gì):

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

Thay thế (một số / tất cả) $.getJSONbằng$.postJSON và tận hưởng!

Bạn có thể sử dụng các hàm gọi lại Javascript tương tự như với $.getJSON. Không cần thay đổi phía máy chủ. (Chà, tôi luôn khuyên bạn nên sử dụng $_REQUESTtrong PHP. Http://php.net/manual/en/reserved.variables.request.php , Trong số $ _REQUEST, $ _GET và $ _POST thì cái nào là nhanh nhất? )

Điều này đơn giản hơn giải pháp của @ lepe.


Điều này không hoạt động với các phương thức done () và fail () mà bạn thường có thể áp dụng cho getJSON.
HackWeight

3

Tôi có mã đang thực hiện getJSON. Tôi chỉ đơn giản là thay thế nó bằng bài đăng. Tôi ngạc nhiên, nó hoạt động

   $.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

Tôi chỉ sử dụng bài đăng và một if:

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()khá tiện dụng để gửi một yêu cầu AJAX và lấy lại dữ liệu JSON dưới dạng phản hồi. Than ôi, tài liệu jQuery thiếu một hàm chị em nên được đặt tên $.postJSON(). Tại sao không chỉ sử dụng$.getJSON() và được thực hiện với nó? Chà, có lẽ bạn muốn gửi một lượng lớn dữ liệu hoặc trong trường hợp của tôi, IE7 không muốn hoạt động bình thường với yêu cầu GET.

Đúng là, hiện tại không có $.postJSON()phương pháp nào , nhưng bạn có thể thực hiện điều tương tự bằng cách chỉ định tham số thứ tư (kiểu) trong $.post()hàm:

Mã của tôi trông như thế này:

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

-8

nếu bạn chỉ có hai tham số, bạn có thể làm điều này:

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

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

5
tôi nghĩ đây không phải là câu trả lời cho những gì đã được hỏi.
Harmeet Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.