Chuyển đổi đối tượng JS thành dữ liệu biểu mẫu


128

Làm cách nào để tôi có thể chuyển đổi Đối tượng JS của mình thành FormData?

Lý do tại sao tôi muốn làm điều này là, tôi có một đối tượng mà tôi đã xây dựng từ các giá trị trường biểu mẫu ~ 100.

var item = {
   description: 'Some Item',
   price : '0.00',
   srate : '0.00',
   color : 'red',
   ...
   ...
}

Bây giờ tôi được yêu cầu thêm chức năng tệp tải lên vào biểu mẫu của mình, điều này tất nhiên là không thể thông qua JSON và vì vậy tôi đang lên kế hoạch chuyển sang FormData. Vậy có cách nào để tôi có thể chuyển đổi đối tượng JS của mình thành FormDatakhông?


bạn có thể chia sẻ công việc / tiến trình của bạn không?
Ritikesh

còn JSON.stringify () thì sao?
Sunny Sharma

1
@Sunny - Điều đó sẽ tạo ra một văn bản JSON trong một chuỗi. Đó không phải là một FormDatađối tượng.
Quentin

Có, bạn có thể, bạn có thể thêm vào các đối tượng formData.
adeneo

bạn có thể cho chúng tôi biết ý bạn của FormData là gì không? bất kỳ định dạng cụ thể?
Sunny Sharma

Câu trả lời:


153

Nếu bạn có một đối tượng, bạn có thể dễ dàng tạo một đối tượng FormData và nối các tên và giá trị từ đối tượng đó vào formData.

Bạn chưa đăng bất kỳ mã nào, vì vậy đó là một ví dụ chung;

var form_data = new FormData();

for ( var key in item ) {
    form_data.append(key, item[key]);
}

$.ajax({
    url         : 'http://example.com/upload.php',
    data        : form_data,
    processData : false,
    contentType : false,
    type: 'POST'
}).done(function(data){
    // do stuff
});

Có nhiều ví dụ hơn trong tài liệu về MDN


3
@Lior - itemlà một đối tượng thông thường được tạo bởi OP, vì vậy nó không nên có bất kỳ thuộc tính nào không phải của riêng nó, trừ khi ai đó mắc lỗi khi tạo nguyên mẫu một cái gì đó vào hàm tạo Đối tượng, trong trường hợp đó bạn sẽ gặp rắc rối và nó không phải là thứ mà chúng ta phải bảo vệ chống lại.
adeneo

2
@Lior - nó chỉ là thêm các cặp khóa / giá trị vào FormData, thêm một thuộc tính nguyên mẫu sẽ không phá vỡ bất kỳ điều gì và việc sử dụng Object.keyskhông phải là câu trả lời, vì bạn không cần phải lấy các khóa dưới dạng một mảng, sau đó lặp lại các khóa để lấy các giá trị, bạn nên sử dụng một for..invòng lặp.
adeneo

2
Tất nhiên, bạn sẽ không biết máy chủ đang mong đợi điều gì ... vì ... trong JS là problamtic, giải pháp không nhất thiết phải là Object.keys (), nó có thể là hasOwnProperty (), nhưng nó cần ít nhất là một cảnh báo.
Lior

3
@Lior - Nếu máy chủ của bạn bị hỏng khi nhận thêm một cặp khóa / giá trị trong yêu cầu ĐĂNG, thì bạn đang làm sai. Tôi nghĩ câu trả lời là ổn và tôi sẽ không thay đổi nó để sử dụng Object.keyshoặc hasOwnProperty()như đối tượng được đăng trong câu hỏi và không cần bất kỳ câu trả lời nào trong số đó. Lý do đôi khi bạn thấy hasOwnPropertyđược sử dụng trong các plugin, v.v. là vì bạn không bao giờ biết một số người có thể làm gì với hàm Objecttạo, nhưng đối với hầu hết mọi người không cần phải kiểm tra các thuộc tính kế thừa trên các đối tượng mà họ đã tạo, đó là một dấu hiệu cho thấy có lẽ bạn đang làm gì đó sai.
adeneo

5
@Hay bạn có định chế tạo máy bay từ rơm tiếp theo, hy vọng rằng sẽ thu hút được nhiều máy bay thật hơn sẽ thả thức ăn từ trên trời xuống không? Điều quan trọng là phải hiểu lý do tại sao kiểm tra hasOwnProperty được sử dụng, chỉ cần nói những điều được coi là "phương pháp hay nhất" vì bạn đọc sách của ai đó (đoán, của Crockford) không giúp bạn đi xa được, cố gắng giáo dục một thành viên như vậy với hơn 100 lần danh tiếng và gấp 100 lần số câu trả lời bạn có cũng không giúp ích nhiều cho quan điểm của bạn. Ngoài ra, đặt tên cho một lib bên thứ ba mới thay đổi nguyên mẫu? Bài đăng đó là từ một thời điểm khác ...
Benjamin Gruenbaum

83

Với ES6 và một cách tiếp cận lập trình chức năng hơn, câu trả lời của @ adeneo có thể giống như sau:

function getFormData(object) {
    const formData = new FormData();
    Object.keys(object).forEach(key => formData.append(key, object[key]));
    return formData;
}

Và cách khác sử dụng .reduce()và các hàm mũi tên:

getFormData = object => Object.keys(object).reduce((formData, key) => {
    formData.append(key, object[key]);
    return formData;
}, new FormData());

44

Hàm này thêm tất cả dữ liệu từ đối tượng vào FormData

Phiên bản ES6 từ @ developer033:

function buildFormData(formData, data, parentKey) {
  if (data && typeof data === 'object' && !(data instanceof Date) && !(data instanceof File)) {
    Object.keys(data).forEach(key => {
      buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key);
    });
  } else {
    const value = data == null ? '' : data;

    formData.append(parentKey, value);
  }
}

function jsonToFormData(data) {
  const formData = new FormData();

  buildFormData(formData, data);

  return formData;
}

const my_data = {
  num: 1,
  falseBool: false,
  trueBool: true,
  empty: '',
  und: undefined,
  nullable: null,
  date: new Date(),
  name: 'str',
  another_object: {
    name: 'my_name',
    value: 'whatever'
  },
  array: [
    {
      key1: {
        name: 'key1'
      }
    }
  ]
};

jsonToFormData(my_data)

Phiên bản jQuery:

function appendFormdata(FormData, data, name){
    name = name || '';
    if (typeof data === 'object'){
        $.each(data, function(index, value){
            if (name == ''){
                appendFormdata(FormData, value, index);
            } else {
                appendFormdata(FormData, value, name + '['+index+']');
            }
        })
    } else {
        FormData.append(name, data);
    }
}


var formData = new FormData(),
    your_object = {
        name: 'test object',
        another_object: {
            name: 'and other objects',
            value: 'whatever'
        }
    };
appendFormdata(formData, your_object);

Hãy giữ nó lên
Vivek Doshi

Hoạt động rất tốt! Cảm ơn bạn! Tôi cũng đã có thêm && !(data instanceof Blob)trong trường hợp của tôi để tải lên hình ảnh của tôi
Clément Baconnier

Hoạt động tốt đối với tôi, tôi đã thêm if (typeof data === 'object' && data! == null) {bởi vì nó ném ra ngoại lệ nếu giá trị là null
al000y

Đối với phiên bản ES6, tôi đã thêm && !(Array.isArray(data) && !data.length)điều kiện "nếu", nếu không mảng trống sẽ bị xóa.
Mtxz

14

Các câu trả lời khác không đầy đủ cho tôi. Tôi bắt đầu từ câu trả lời @Vladimir Novopashin và sửa đổi nó. Đây là những thứ tôi cần và lỗi tôi đã tìm thấy:

  • Hỗ trợ cho tệp
  • Hỗ trợ mảng
  • Lỗi: Tệp bên trong đối tượng phức tạp cần được thêm .propthay vì [prop]. Ví dụ: formData.append('photos[0][file]', file)không hoạt động trên google chrome, trong khi formData.append('photos[0].file', file)hoạt động
  • Bỏ qua một số thuộc tính trong đối tượng của tôi

Mã sau sẽ hoạt động trên IE11 và các trình duyệt thường xanh.

function objectToFormData(obj, rootName, ignoreList) {
    var formData = new FormData();

    function appendFormData(data, root) {
        if (!ignore(root)) {
            root = root || '';
            if (data instanceof File) {
                formData.append(root, data);
            } else if (Array.isArray(data)) {
                for (var i = 0; i < data.length; i++) {
                    appendFormData(data[i], root + '[' + i + ']');
                }
            } else if (typeof data === 'object' && data) {
                for (var key in data) {
                    if (data.hasOwnProperty(key)) {
                        if (root === '') {
                            appendFormData(data[key], key);
                        } else {
                            appendFormData(data[key], root + '.' + key);
                        }
                    }
                }
            } else {
                if (data !== null && typeof data !== 'undefined') {
                    formData.append(root, data);
                }
            }
        }
    }

    function ignore(root){
        return Array.isArray(ignoreList)
            && ignoreList.some(function(x) { return x === root; });
    }

    appendFormData(obj, rootName);

    return formData;
}

1
Câu trả lời duy nhất hỗ trợ mảng, đối tượng và tệp.
sotn

Chào bạn, tại sao bạn thêm File vào thư mục gốc? Có thể thêm nó cho trẻ em quá?
Cedric Arnould,

@CedricArnould Có thể là một sự hiểu lầm nhưng phương thức này là đệ quy nên ngay cả khi nó được viết formData.append(root, data), nó không có nghĩa là nó được thêm vào gốc.
Gudradain

Tôi hiểu câu trả lời của bạn, thật kỳ lạ khi tôi nhận được kết quả trong máy chủ, tôi có một Bộ sưu tập Tệp và dữ liệu duy nhất. Nhưng tôi có thể thấy trong một Tệp, tên cung cấp thông tin mà nó được kết nối với con nào. Có thể vấn đề đến từ .Net Core và cách nó quản lý các tệp tải lên. Cảm ơn câu trả lời của bạn.
Cedric Arnould

Tôi đang cố gắng sử dụng cái này nhưng không có ví dụ sử dụng. định dạng mong đợi của tham số ignoreList sẽ khá hữu ích.
jpro

8

Hãy thử hàm JSON.stringify như bên dưới

var postData = JSON.stringify(item);
var formData = new FormData();
formData.append("postData",postData );

1
Đây là cách tốt nhất để đạt được điều này.
Rob

giữ nó gắn json sau nhiều lần debug lỗi
Tuyết căn cứ

7

Tôi đã có một tình huống trong đó JSON lồng nhau phải được tuần tự hóa theo kiểu tuyến tính trong khi dữ liệu biểu mẫu được xây dựng, vì đây là cách máy chủ mong đợi giá trị. Vì vậy, tôi đã viết một hàm đệ quy nhỏ để dịch JSON giống như sau:

{
   "orderPrice":"11",
   "cardNumber":"************1234",
   "id":"8796191359018",
   "accountHolderName":"Raj Pawan",
   "expiryMonth":"02",
   "expiryYear":"2019",
   "issueNumber":null,
   "billingAddress":{
      "city":"Wonderland",
      "code":"8796682911767",
      "firstname":"Raj Pawan",
      "lastname":"Gumdal",
      "line1":"Addr Line 1",
      "line2":null,
      "state":"US-AS",
      "region":{
         "isocode":"US-AS"
      },
      "zip":"76767-6776"
   }
}

Thành một cái gì đó như thế này:

{
   "orderPrice":"11",
   "cardNumber":"************1234",
   "id":"8796191359018",
   "accountHolderName":"Raj Pawan",
   "expiryMonth":"02",
   "expiryYear":"2019",
   "issueNumber":null,
   "billingAddress.city":"Wonderland",
   "billingAddress.code":"8796682911767",
   "billingAddress.firstname":"Raj Pawan",
   "billingAddress.lastname":"Gumdal",
   "billingAddress.line1":"Addr Line 1",
   "billingAddress.line2":null,
   "billingAddress.state":"US-AS",
   "billingAddress.region.isocode":"US-AS",
   "billingAddress.zip":"76767-6776"
}

Máy chủ sẽ chấp nhận dữ liệu biểu mẫu ở định dạng được chuyển đổi này.

Đây là chức năng:

function jsonToFormData (inJSON, inTestJSON, inFormData, parentKey) {
    // http://stackoverflow.com/a/22783314/260665
    // Raj: Converts any nested JSON to formData.
    var form_data = inFormData || new FormData();
    var testJSON = inTestJSON || {};
    for ( var key in inJSON ) {
        // 1. If it is a recursion, then key has to be constructed like "parent.child" where parent JSON contains a child JSON
        // 2. Perform append data only if the value for key is not a JSON, recurse otherwise!
        var constructedKey = key;
        if (parentKey) {
            constructedKey = parentKey + "." + key;
        }

        var value = inJSON[key];
        if (value && value.constructor === {}.constructor) {
            // This is a JSON, we now need to recurse!
            jsonToFormData (value, testJSON, form_data, constructedKey);
        } else {
            form_data.append(constructedKey, inJSON[key]);
            testJSON[constructedKey] = inJSON[key];
        }
    }
    return form_data;
}

Lời mời:

        var testJSON = {};
        var form_data = jsonToFormData (jsonForPost, testJSON);

Tôi đang sử dụng testJSON chỉ để xem kết quả được chuyển đổi vì tôi sẽ không thể trích xuất nội dung của form_data. AJAX đăng cuộc gọi:

        $.ajax({
            type: "POST",
            url: somePostURL,
            data: form_data,
            processData : false,
            contentType : false,
            success: function (data) {
            },
            error: function (e) {
            }
        });

Chào Raj, làm thế nào về mảng? Giả sử rằng bạn có nhiều hơn 1 địa chỉ thanh toán. Bạn sẽ sửa nó như thế nào?
Sam

1
Tôi đã tìm thấy câu trả lời! Bài viết của bạn thực sự hữu ích Cảm ơn!
Sam

3

Xin lỗi vì câu trả lời muộn, nhưng tôi đang gặp khó khăn với vấn đề này vì Angular 2 hiện không hỗ trợ tải lên tệp. Vì vậy, cách để làm điều đó là gửi một XMLHttpRequestvới FormData. Vì vậy, tôi đã tạo một hàm để làm điều đó. Tôi đang sử dụng Typecript . Để chuyển nó sang Javascript chỉ cần loại bỏ khai báo kiểu dữ liệu.

/**
     * Transforms the json data into form data.
     *
     * Example:
     *
     * Input:
     * 
     * fd = new FormData();
     * dob = {
     *  name: 'phone',
     *  photos: ['myphoto.jpg', 'myotherphoto.png'],
     *  price: '615.99',
     *  color: {
     *      front: 'red',
     *      back: 'blue'
     *  },
     *  buttons: ['power', 'volup', 'voldown'],
     *  cameras: [{
     *      name: 'front',
     *      res: '5Mpx'
     *  },{
     *      name: 'back',
     *      res: '10Mpx'
     *  }]
     * };
     * Say we want to replace 'myotherphoto.png'. We'll have this 'fob'.
     * fob = {
     *  photos: [null, <File object>]
     * };
     * Say we want to wrap the object (Rails way):
     * p = 'product';
     *
     * Output:
     *
     * 'fd' object updated. Now it will have these key-values "<key>, <value>":
     *
     * product[name], phone
     * product[photos][], myphoto.jpg
     * product[photos][], <File object>
     * product[color][front], red
     * product[color][back], blue
     * product[buttons][], power
     * product[buttons][], volup
     * product[buttons][], voldown
     * product[cameras][][name], front
     * product[cameras][][res], 5Mpx
     * product[cameras][][name], back
     * product[cameras][][res], 10Mpx
     * 
     * @param {FormData}  fd  FormData object where items will be appended to.
     * @param {Object}    dob Data object where items will be read from.
     * @param {Object =   null} fob File object where items will override dob's.
     * @param {string =   ''} p Prefix. Useful for wrapping objects and necessary for internal use (as this is a recursive method).
     */
    append(fd: FormData, dob: Object, fob: Object = null, p: string = ''){
        let apnd = this.append;

        function isObj(dob, fob, p){
            if(typeof dob == "object"){
                if(!!dob && dob.constructor === Array){
                    p += '[]';
                    for(let i = 0; i < dob.length; i++){
                        let aux_fob = !!fob ? fob[i] : fob;
                        isObj(dob[i], aux_fob, p);
                    }
                } else {
                    apnd(fd, dob, fob, p);
                }
            } else {
                let value = !!fob ? fob : dob;
                fd.append(p, value);
            }
        }

        for(let prop in dob){
            let aux_p = p == '' ? prop : `${p}[${prop}]`;
            let aux_fob = !!fob ? fob[prop] : fob;
            isObj(dob[prop], aux_fob, aux_p);
        }
    }

Bạn phải bao gồm chỉ số mảng thay vì một []đối với tài sản đối tượng bên trong một mảng số để giữ nguyên vẹn
Vicary

1

Phiên bản TypeScript:

static convertModelToFormData(model: any, form: FormData = null, namespace = ''): FormData {
    let formData = form || new FormData();
    for (let propertyName in model) {
      if (!model.hasOwnProperty(propertyName) || model[propertyName] == undefined) continue;
      let formKey = namespace ? `${namespace}[${propertyName}]` : propertyName;
      if (model[propertyName] instanceof Date) {        
        formData.append(formKey, this.dateTimeToString(model[propertyName]));
      }
      else if (model[propertyName] instanceof Array) {
        model[propertyName].forEach((element, index) => {
          if (typeof element != 'object')
            formData.append(`${formKey}[]`, element);
          else {
            const tempFormKey = `${formKey}[${index}]`;
            this.convertModelToFormData(element, formData, tempFormKey);
          }
        });
      }
      else if (typeof model[propertyName] === 'object' && !(model[propertyName] instanceof File)) {        
        this.convertModelToFormData(model[propertyName], formData, formKey);
      }
      else {        
        formData.append(formKey, model[propertyName].toString());
      }
    }
    return formData;
  }

https://gist.github.com/Mds92/091828ea857cc556db2ca0f991fee9f6


1
Trước hết, namespacelà một từ khóa dành riêng trong TypeScript( stylescriptlang.org/docs/handbook/namespaces.htmlgithub.com/Microsoft/TypeScript/issues/… ). Ngoài ra, có vẻ như bạn quên để đối phó với Filenhật kể từ lần elsesẽ append "[object File]"đến formData.
Jyrkka

1

Bạn chỉ cần cài đặt qs:

npm i qs

Chỉ cần nhập:

import qs from 'qs'

Chuyển đối tượng tới qs.stringify():

var item = {
   description: 'Some Item',
   price : '0.00',
   srate : '0.00',
   color : 'red',
   ...
   ...
}

qs.stringify(item)

1

Đệ quy

const toFormData = (f => f(f))(h => f => f(x => h(h)(f)(x)))(f => fd => pk => d => {
  if (d instanceof Object) {
    Object.keys(d).forEach(k => {
      const v = d[k]
      if (pk) k = `${pk}[${k}]`
      if (v instanceof Object && !(v instanceof Date) && !(v instanceof File)) {
        return f(fd)(k)(v)
      } else {
        fd.append(k, v)
      }
    })
  }
  return fd
})(new FormData())()

let data = {
  name: 'John',
  age: 30,
  colors: ['red', 'green', 'blue'],
  children: [
    { name: 'Max', age: 3 },
    { name: 'Madonna', age: 10 }
  ]
}
console.log('data', data)
document.getElementById("data").insertAdjacentHTML('beforeend', JSON.stringify(data))

let formData = toFormData(data)

for (let key of formData.keys()) {
  console.log(key, formData.getAll(key).join(','))
  document.getElementById("item").insertAdjacentHTML('beforeend', `<li>${key} = ${formData.getAll(key).join(',')}</li>`)
}
<p id="data"></p>
<ul id="item"></ul>


câu trả lời hay nhất imho
ling

0

Phương thức này chuyển đổi một đối tượng JS thành một FormData:

function convertToFormData(params) {
    return Object.entries(params)
        .reduce((acc, [key, value]) => {
            if (Array.isArray(value)) {
                value.forEach((v, k) => acc.append(`${key}[${k}]`, value));
            } else if (typeof value === 'object' && !(value instanceof File) && !(value instanceof Date)) {
                Object.entries(value).forEach((v, k) => acc.append(`${key}[${k}]`, value));
            } else {
                acc.append(key, value);
            }

            return acc;
        }, new FormData());
}


Chỉ cần sửa cuộc gọi các mục nhập đối tượng lồng nhau lặp lại: Object.entries(value).forEach((v, k) => acc.append(`${key}[${v[0]}]`, v[1]));
heber gentilin

0

Trong trường hợp của tôi, đối tượng của tôi cũng có thuộc tính là mảng các tệp. Vì chúng là hệ nhị phân nên chúng nên được xử lý khác nhau - chỉ mục không cần phải là một phần của khóa. Vì vậy, tôi đã sửa đổi câu trả lời của @Vladimir Novopashin và @ developer033:

export function convertToFormData(data, formData, parentKey) {
  if(data === null || data === undefined) return null;

  formData = formData || new FormData();

  if (typeof data === 'object' && !(data instanceof Date) && !(data instanceof File)) {
    Object.keys(data).forEach(key => 
      convertToFormData(data[key], formData, (!parentKey ? key : (data[key] instanceof File ? parentKey : `${parentKey}[${key}]`)))
    );
  } else {
    formData.append(parentKey, data);
  }

  return formData;
}

0

Tôi đã sử dụng cái này để Đăng dữ liệu đối tượng của mình dưới dạng Dữ liệu biểu mẫu.

const encodeData = require('querystring');

const object = {type: 'Authorization', username: 'test', password: '123456'};

console.log(object);
console.log(encodeData.stringify(object));

0

Có thể bạn đang tìm kiếm cái này, một mã nhận đối tượng javascript của bạn, tạo một đối tượng FormData từ nó và sau đó ĐĂNG nó lên máy chủ của bạn bằng cách sử dụng API Tìm nạp mới :

    let myJsObj = {'someIndex': 'a value'};

    let datos = new FormData();
    for (let i in myJsObj){
        datos.append( i, myJsObj[i] );
    }

    fetch('your.php', {
        method: 'POST',
        body: datos
    }).then(response => response.json())
        .then(objson => {
            console.log('Success:', objson);
        })
        .catch((error) => {
            console.error('Error:', error);
        });

0

Tôi tham khảo điều này từ câu trả lời của Gudradain . Tôi chỉnh sửa nó một chút ở định dạng Typecript.

class UtilityService {
    private appendFormData(formData, data, rootName) {

        let root = rootName || '';
        if (data instanceof File) {
            formData.append(root, data);
        } else if (Array.isArray(data)) {
            for (var i = 0; i < data.length; i++) {
                this.appendFormData(formData, data[i], root + '[' + i + ']');
            }
        } else if (typeof data === 'object' && data) {
            for (var key in data) {
                if (data.hasOwnProperty(key)) {
                    if (root === '') {
                        this.appendFormData(formData, data[key], key);
                    } else {
                        this.appendFormData(formData, data[key], root + '.' + key);
                    }
                }
            }
        } else {
            if (data !== null && typeof data !== 'undefined') {
                formData.append(root, data);
            }
        }
    }

    getFormDataFromObj(data) {
        var formData = new FormData();

        this.appendFormData(formData, data, '');

        return formData;
    }
}

export let UtilityMan = new UtilityService();

0

Tôi có thể đến bữa tiệc hơi muộn nhưng đây là những gì tôi đã tạo để chuyển đổi một đối tượng số ít thành FormData.

function formData(formData, filesIgnore = []) {
  let data = new FormData();

  let files = filesIgnore;

  Object.entries(formData).forEach(([key, value]) => {
    if (typeof value === 'object' && !files.includes(key)) {
      data.append(key, JSON.stringify(value) || null);
    } else if (files.includes(key)) {
      data.append(key, value[0] || null);
    } else {
      data.append(key, value || null);
    }
  })

  return data;
}

Làm thế nào nó hoạt động? Nó sẽ chuyển đổi và trả về tất cả các thuộc tính mong đợi Đối tượng tệp mà bạn đã đặt trong danh sách bỏ qua (đối số thứ 2. Nếu ai đó có thể cho tôi biết cách tốt hơn để xác định điều này sẽ hữu ích!) Thành một chuỗi json bằng cách sử dụng JSON.stringify. Sau đó, trên máy chủ của bạn, bạn chỉ cần chuyển đổi nó trở lại thành một đối tượng JSON.

Thí dụ:

let form = {
  first_name: 'John',
  last_name: 'Doe',
  details: {
    phone_number: 1234 5678 910,
    address: '123 Some Street',
  },
  profile_picture: [object FileList] // set by your form file input. Currently only support 1 file per property.
}

function submit() {
  let data = formData(form, ['profile_picture']);

  axios.post('/url', data).then(res => {
    console.log('object uploaded');
  })
}

Tôi vẫn còn mới đối với yêu cầu Http và JavaScript nên mọi phản hồi sẽ được đánh giá cao!


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.