Javascript: Gửi đối tượng JSON với Ajax?


151

Điều này có thể không?

xmlHttp.send({
    "test" : "1",
    "test2" : "2",
});

Có thể với: một tiêu đề với content type: application/json?:

xmlHttp.setRequestHeader('Content-Type', 'application/json')

Nếu không tôi có thể sử dụng:

xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

và sau đó JSON.stringifylà đối tượng JSON và gửi nó trong một tham số, nhưng sẽ rất tuyệt nếu gửi nó theo cách này nếu có thể.

Câu trả lời:


330

Với jQuery:

$.post("test.php", { json_string:JSON.stringify({name:"John", time:"2pm"}) });

Không có jQuery:

var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/json-handler");
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({name:"John Rambo", time:"2pm"}));

2
nhưng tôi có thể sử dụng kiểu nội dung: application/x-www-form-urlencodednếu tôi sử dụng chuỗi, thì điểm cần sử dụng là application/jsongì? :)
Adam

4
@CIRK: Chuyện gì vậy? Cài đặt loại nội dung hoàn toàn tùy ý trừ khi máy chủ xử lý đặc biệt cái này hay cái khác. Nó chỉ là dữ liệu chảy qua lại vào cuối ngày.
mellamokb

17
tốt nếu phần thân bài đăng của bạn được dự kiến ​​là JSON, ví dụ: ({name: "John", thời gian: "2pm"}) sử dụng ứng dụng loại nội dung / json nếu phần thân bài của bạn ở dạng dữ liệu urlencoding (name = John & time = 2pm) sử dụng ứng dụng / x-www-form-urlencoding
Nathan Romano

1
Tôi nên đặt URL ở đâu?
Aaron Liu

6
@ShuruiLiu một URL thay thế "/json-handler"như một thông số thứ 2 của open()phương thức
Alexandr Nil

36

Nếu bạn không sử dụng jQuery thì hãy chắc chắn:

var json_upload = "json_name=" + JSON.stringify({name:"John Rambo", time:"2pm"});
var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/file.php");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(json_upload);

Và cho kết thúc nhận php:

 $_POST['json_name'] 

Không thể sử dụng nó trực tiếp?
rohitsakala

8
Tôi không nghĩ rằng câu trả lời này cho câu hỏi. Tôi tin rằng nhà phát triển muốn gửi một blob JSON đến PHP dưới dạng Content-Type: application / json, không được gói trong một trình bao bọc urlencoding.
Fordi

1
Đây không thực sự là gửi JSON, nó đang gửi formdata. Bạn cũng có thể gửi JSON trực tiếp, trong trường hợp đó bạn không thể đọc nó bằng $ _POST, nhưng thay vào đó hãy đọc nó bằng json_decode (file_get_contents ('php: // input'));
David

Các bạn thân mến, bạn có thể chia sẻ POST ajax này với toàn bộ mã cần thiết được sử dụng trên trang không? Hoặc cũng cảm ơn bạn nếu bạn có một liên kết tốt với một số ví dụ hoạt động đầy đủ về vanilla ajax POST với JSON
Robert

1

Tôi đã vật lộn trong một vài ngày để tìm thấy bất cứ điều gì có thể làm việc cho tôi khi vượt qua nhiều mảng id và trả lại một đốm màu. Hóa ra nếu sử dụng .NET CORE tôi đang sử dụng 2.1, bạn cần sử dụng [FromBody] và như chỉ có thể sử dụng một khi bạn cần tạo một chế độ xem để giữ dữ liệu.

Kết thúc nội dung như dưới đây,

var params = {
            "IDs": IDs,
            "ID2s": IDs2,
            "id": 1
        };

Trong trường hợp của tôi, tôi đã xử lý các mảng và truyền kết quả cho hàm

var IDs = JsonConvert.SerializeObject(Model.Select(s => s.ID).ToArray());

Sau đó gọi XMLHttpRequest POST và xâu chuỗi đối tượng

var ajax = new XMLHttpRequest();
ajax.open("POST", '@Url.Action("MyAction", "MyController")', true);
ajax.responseType = "blob";
ajax.setRequestHeader("Content-Type", "application/json;charset=UTF-8");           
ajax.onreadystatechange = function () {
    if (this.readyState == 4) {
       var blob = new Blob([this.response], { type: "application/octet-stream" });
       saveAs(blob, "filename.zip");
    }
};

ajax.send(JSON.stringify(params));

Sau đó, có một mô hình như thế này

public class MyModel
{
    public int[] IDs { get; set; }
    public int[] ID2s { get; set; }
    public int id { get; set; }
}

Sau đó chuyển qua trong Hành động như

public async Task<IActionResult> MyAction([FromBody] MyModel model)

Sử dụng tiện ích bổ sung này nếu bạn trả lại một tệp

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>

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.