różnice w application / json i application / x-www-form-urlencoded

159

Jaka jest różnica pomiędzy

request.ContentType = "application / json; charset = utf-8";

i

webRequest.ContentType = "aplikacja / x-www-form-urlencoded";

Prithvi Raj Nandiwal
źródło

Odpowiedzi:

187

Pierwszym przypadkiem jest poinformowanie serwera internetowego, że publikujesz dane JSON, jak w:

{ Name : 'John Smith', Age: 23}

Drugą opcją jest poinformowanie serwera internetowego, że będziesz kodować parametry w adresie URL, jak w:

Name=John+Smith&Age=23
Ikar
źródło
17
Jakie ma to konsekwencje po stronie serwera. Widzę witryny takie jak stackoverflow i Twitter używające x-www-form-urlencodedżądań AJAX, takich jak głosowanie itp. Odesłana odpowiedź to JSON. Myślę, że lepiej jest mieć symetryczną parę żądanie / odpowiedź, czyli oba JSON.
użytkownik
@buffer Ciekawi mnie również odpowiedź na twoje symetryczne pytanie.
Adam Johns
1
@AdamJohns: Ten blog jest wart przeczytania, chociaż nie zawiera dokładnej odpowiedzi na pytanie „dlaczego”: homakov.blogspot.in/2012/06/…
użytkownik
21
@buffer Rozumiem, że używanie JSON jako contentType pomaga, gdy dane do wysłania są bardziej złożone i zawierają dużo hierarchii .. podczas gdy zakodowany formularz jest dobry do wysyłania prostych parametrów w adresie URL, które można odczytać na zapleczu bez zbytniego kodu. .. Myślę, że to wyjaśnia dlaczego.
Ankit Srivastava
@Medorator Spóźniony komentarz. Chociaż na przykład, gdy wysyłasz złożony obiekt JSON z tablicą obiektów w nim, użycie application/x-www-form-urlencodedzmyliłoby serwer (w moim przypadku Elixir używający Poison) i spowodowałoby niewłaściwe parsowanie obiektu (w jakiś sposób przekształciło zagnieżdżoną tablicę obiektów na mapę zamiast listy). application/jsonW tym przypadku użycie powinno być właściwym wyborem.
xji
6

webRequest.ContentType = "aplikacja / x-www-form-urlencoded";

  1. Skąd pochodzi nazwa application / x-www-form-urlencoded ?

    Jeśli wysyłasz żądanie HTTP GET , możesz użyć parametrów zapytania w następujący sposób:

    http://example.com/path/to/page? name = fretka & color = purple

    Zawartość pól jest kodowana jako ciąg zapytania. The application/x-www-form- urlencodedNazwy pochodzą z poprzedniego parametru zapytania url ale parametry zapytań w przypadku gdy organ wniosku zamiast adresu URL.

    Całe dane formularza są wysyłane jako długi ciąg zapytania, który zawiera pary nazwa- wartość oddzielone znakiem &

    np. pole1 = wartość1 i pole2 = wartość2

  2. Może to być proste żądanie zwane prostym - nie uruchamiaj kontroli wstępnej

    Proste żądanie musi mieć pewne właściwości. Więcej informacji można znaleźć tutaj . Jedną z nich jest to, że w nagłówku Content-Type dla prostych żądań dozwolone są tylko trzy wartości

    • application / x-www-form-urlencoded
    • multipart / form-data
    • Zwykły tekst

3. Dla większości płaskich drzew param wypróbowano i przetestowano application / x-www-form-urlencoded.

request.ContentType = "application / json; charset = utf-8";

  1. Dane będą w formacie json .

axios i superagent , dwie z bardziej popularnych bibliotek npm HTTP, domyślnie współpracują z treściami JSON.

{
  "id": 1,
  "name": "Foo",
  "price": 123,
  "tags": [
    "Bar",
    "Eek"
  ],
  "stock": {
    "warehouse": 300,
    "retail": 20
  }
}
  1. Typ zawartości „application / json” jest jednym z wstępnie sprawdzonych żądań .

Teraz, jeśli żądanie nie jest prostym żądaniem , przeglądarka automatycznie wysyła żądanie HTTP przed pierwotnym metodą OPTIONS , aby sprawdzić, czy wysyłanie pierwotnego żądania jest bezpieczne. Jeśli wszystko jest w porządku, wyślij aktualne żądanie. Więcej informacji można znaleźć tutaj .

  1. application / json jest przyjazny dla początkujących. Tablice zakodowane w adresach URL mogą być koszmarem!
fgul
źródło