ใช้ getJSON ส่งข้อมูลด้วยวิธีโพสต์ยังไง?


108

ฉันใช้วิธีการด้านบนและทำงานได้ดีกับพารามิเตอร์หนึ่งใน URL

เช่นStudents/getstud/1เมื่อใช้รูปแบบคอนโทรลเลอร์ / การกระทำ / พารามิเตอร์

ตอนนี้ฉันมีการดำเนินการในตัวควบคุมนักเรียนที่ยอมรับสองพารามิเตอร์และส่งคืนออบเจ็กต์ JSON

ฉันจะโพสต์ข้อมูล$.getJSON()โดยใช้วิธีโพสต์ได้อย่างไร?

วิธีการที่คล้ายกันยังเป็นที่ยอมรับ

ประเด็นคือการเรียกการกระทำของคอนโทรลเลอร์ด้วย AJAX


4
getในgetJSONวิธีการใช้ GETที่จะได้รับ JSON บาง
Majid Fouladpour

1
@Majid Fouladpour เมื่อถามคำถามนี้ก็ไม่รู้ว่า .. !
Vikas

คำตอบ:


217

เมธอด $ .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 คุณสามารถใช้วิธีการทำให้เป็นอนุกรมเพื่อสร้างข้อมูลสำหรับ POST จากแบบฟอร์มของคุณ

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

7
เพียงแค่ต้องการเพิ่ม $ .getJSON นั้นสนับสนุน Jsonp (การเข้าถึงข้ามโดเมน) น่าเสียดายที่ $ .post not
Tomas

2
จริงๆแล้ว. getJSON () รองรับการเข้าถึงข้ามโดเมนได้สองวิธี JSONP ซึ่งไม่ใช้ GET หรือ POST แต่เป็นการแทรกสคริปต์ แต่ยัง CORS - และ .post () ยังรองรับ CORS อย่างไรก็ตาม CORS ต้องการให้เซิร์ฟเวอร์รองรับในขณะที่ JSONP ไม่
hippietrail

2
ไม่เป็นความจริง JSONP ยังต้องการการสนับสนุนเซิร์ฟเวอร์เพื่อแยกวิเคราะห์พารามิเตอร์การเรียกกลับ
Shrulik

เมื่อฉันใช้ฟังก์ชันข้างต้นฉันได้รับสตริงอ็อบเจกต์แทนที่จะเป็นวัตถุ json
Pratik Singhal

13

นี่คือโซลูชัน "บรรทัดเดียว" ของฉัน:

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

ในการใช้วิธี jsonp และ POST ฟังก์ชันนี้จะเพิ่มพารามิเตอร์ GET "callback" ให้กับ URL นี่คือวิธีใช้:

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

เซิร์ฟเวอร์ต้องเตรียมพร้อมเพื่อจัดการกับพารามิเตอร์ callback GET และส่งคืนสตริง json เป็น:

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

ซึ่ง "jsonp000000" คือค่าเรียกกลับ GET

ใน PHP การใช้งานจะเป็นดังนี้:

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

ฉันได้ทำการทดสอบข้ามโดเมนและดูเหมือนว่าจะได้ผล ยังคงต้องการการทดสอบเพิ่มเติม


1
สิ่งนี้จะไม่ข้ามขีด จำกัด GET มีในขณะที่ขนาดสูงสุดของ POST สามารถกำหนดใหม่ได้
Dementic

ทำไมคุณถึงเพิ่ม?callback? ใน url? นั่นทำให้การโทรกลับไม่ถูกเรียกหาฉัน JSON.stringify(data)ฉันยังเพิ่ม +1 โพสต์ที่เป็นประโยชน์!
IonicăBizău

@ IonicăBizău: ขอบคุณ ในการส่งคืนอ็อบเจ็กต์เราต้องเพิ่มพารามิเตอร์ "callback" ให้กับ URL และเซิร์ฟเวอร์ต้องส่งคืนชื่ออ็อบเจ็กต์เดียวกับที่สร้างโดย JQuery ฉันยังใช้ฟังก์ชัน override สำหรับ getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
lepe

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


สิ่งนี้ใช้ไม่ได้กับเมธอด done () และ fail () ที่คุณสามารถใช้กับ getJSON ได้ตามปกติ
HackWeight

3

ฉันมีรหัสที่กำลังทำ getJSON ฉันเพียงแค่แทนที่ด้วยโพสต์ ฉันประหลาดใจมากที่ได้ผล

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

ฉันเพิ่งใช้โพสต์และ 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()ค่อนข้างสะดวกในการส่งคำขอ AJAX และรับข้อมูล JSON กลับเป็นการตอบกลับ อนิจจาเอกสาร jQuery $.postJSON()ขาดฟังก์ชั่นน้องสาวที่ควรตั้งชื่อว่า ทำไมไม่เพียงแค่ใช้$.getJSON()และทำกับมัน? บางทีคุณอาจต้องการส่งข้อมูลจำนวนมากหรือในกรณีของฉัน IE7 ไม่ต้องการทำงานอย่างถูกต้องกับคำขอ GET

มันเป็นความจริงในขณะนี้ยังไม่มี$.postJSON()วิธีการใดๆ แต่คุณสามารถทำสิ่งเดียวกันให้สำเร็จได้โดยการระบุพารามิเตอร์ที่สี่ (type) ใน$.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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.