Zauważyłem, że podczas używania $ .post () w jquery, domyślnym contentType jest application / x-www-form-urlencoded - kiedy mój kod mvc asp.net musi mieć contentType = application / json
(Zobacz to pytanie, dlaczego muszę używać aplikacji / json: ASPNET MVC - Dlaczego ModelState.IsValid false „Pole x jest wymagane”, gdy to pole ma wartość? )
Jak mogę ustawić $ .post () wysyłanie contentType = application / json? Mam już dużą liczbę funkcji $ .post (), więc nie chcę zmieniać na $ .ajax (), ponieważ zajęłoby to zbyt dużo czasu
Jeśli spróbuję
$.post(url, data, function(), "json")
Nadal ma contentType = application / x-www-form-urlencoded. Co dokładnie robi parametr „json”, jeśli nie zmienia typu zawartości na json?
Jeśli spróbuję
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
To działa, ale wpływa na każdy mój $ .get i $ .post, który mam i powoduje uszkodzenie niektórych.
Czy jest jakiś sposób, aby zmienić zachowanie $ .post (), aby wysłać contentType = application / json?
źródło
jQuery.post
metodę zastępowania , to naprawdę prosta funkcja ..."mystring data"
będzieapplication/x-www-form-urlencoded;
tam, gdzie{ anyKey: "anyvalue and type" }
będzie obiektapplication/json
. Wiele serwerów, które odczytują json, zezwalają tylko na obiekt lub tablicę, a nie na ciąg znaków - dlatego jquery przewiduje to w ten sposób. Jeśli masz serwer, który odczytuje ciągi, liczby itp. Bez zawijania się w obiekcie, musisz określić typ zawartości jak w tej odpowiedzi.Zobacz: jQuery.ajax ()
źródło
JSON.stringify(data)
, ponieważ serwer oczekuje łańcucha JSON, a jQuery po prostu połączy pary klucz-wartość za pomocą ampersandu, urlencododowany.W końcu znalazłem rozwiązanie, które działa dla mnie:
źródło
data
argumentx-www-form-urlencoded
, ale jeśli wskażesz, że typ treści żądania to JSON, nadal nalega na wysłaniedata
w niedopasowanym formacie.W moim skrypcie dodałem następującą metodę do jQuery:
I z niego korzystać
Dokonano tego, po prostu kopiując kod „get” i „post” z oryginalnych źródeł JQuery i zapisując kilka parametrów w celu wymuszenia JSON POST.
Dzięki!
źródło
użyj tylko
ZAKTUALIZOWANO @JK: Jeśli w swoim pytaniu piszesz tylko jeden przykład kodu z $ .post, znajdziesz jeden odpowiadający przykład w odpowiedzi. Nie chcę powtarzać tych samych informacji, które już studiowałeś, dopóki się nie dowiem: $ .post i $ .get to krótkie formy $ .ajax. Więc po prostu użyj $ .ajax i możesz użyć pełnego zestawu jego parametrów bez konieczności zmiany jakichkolwiek ustawień globalnych.
Nawiasem mówiąc, nie polecam zastępowania standardowego $ .post. To moja osobista opinia , ale dla mnie ważne jest nie tylko to, że program działa, ale także to, że wszyscy, którzy czytają twój program, rozumieją go w ten sam sposób. Zastąpienie standardowych metod bez bardzo ważnego powodu może prowadzić do nieporozumień podczas odczytywania kodu programu. Więc powtarzam moje zalecenie jeszcze raz: po prostu użyć oryginalnego jQuery $ .ajax zamiast tworzyć
jQuery.get
ijQuery.post
i odbierać programy, które nie tylko doskonale pracy, ale mogą być odczytywane przez ludzi bez jakichkolwiek nieporozumień.źródło
Typ danych „json”, który można przekazać jako ostatni parametr do post () wskazuje, jakiego typu danych oczekuje funkcja w odpowiedzi serwera, a nie jaki typ wysyła w żądaniu. W szczególności ustawia nagłówek „Accept”.
Szczerze mówiąc, najlepszym rozwiązaniem jest przejście na wywołanie ajax (). Funkcja post () jest pomyślana jako wygoda; uproszczona wersja wywołania ajax (), gdy wykonujesz proste publikowanie formularzy. Nie jesteś
Jeśli naprawdę nie chcesz się przełączać, możesz stworzyć własną funkcję o nazwie powiedzmy xpost (), i po prostu przekształcić podane parametry w parametry dla wywołania jQuery ajax (), z ustawionym typem zawartości. W ten sposób zamiast przepisywania wszystkich funkcji post () na funkcje ajax (), wystarczy zmienić je wszystkie z post na xpost (lub cokolwiek innego).
źródło
Wiem, że to późna odpowiedź, faktycznie mam metodę skrótu, której używam do wysyłania / czytania do / z usług opartych na MS .. działa z MVC, a także ASMX itp ...
Posługiwać się:
UWAGA: Mam również metodę JSON.parseAjax, która jest zmodyfikowana z pliku JS json.org, która dodaje obsługę dat MS „/Date(...)/” ...
Zmodyfikowany plik json2.js nie jest dołączony, w przypadku IE8 używa parsera opartego na skrypcie, ponieważ zdarzają się przypadki, gdy natywny parser ulega awarii podczas rozszerzania prototypu tablicy i / lub obiektu itp.
Zastanawiałem się nad zmianą tego kodu, aby wdrożyć interfejsy obietnic, ale zadziałało to naprawdę dobrze.
źródło
To proste rozszerzenie API jquery (z: https://benjamin-schweizer.de/jquerypostjson.html ) dla $ .postJSON () załatwia sprawę. Możesz używać postJSON () jak każdego innego natywnego wywołania jQuery Ajax. Możesz dołączyć moduły obsługi zdarzeń i tak dalej.
Podobnie jak inne interfejsy API Ajax (jak $ http z AngularJS) ustawia poprawny contentType na application / json. Możesz przekazać swoje dane Json (obiekty javascript) bezpośrednio, ponieważ są one tutaj rygorystyczne. Oczekiwany zwrócony typ danych jest ustawiony na JSON. Możesz dołączyć domyślne procedury obsługi zdarzeń jquery dla obietnic, na przykład:
źródło
Sednem sprawy jest fakt, że JQuery w momencie pisania nie ma metody postJSON, podczas gdy getJSON istnieje i robi właściwą rzecz.
metoda postJSON wykonałaby następujące czynności:
i mogą być używane w następujący sposób:
źródło
Dokumentacja obecnie pokazuje, że od 3,0 $ .post zaakceptuje ustawienia obiektu, co oznacza, że można korzystać z opcji $ .ajax. Wersja 3.0 nie została jeszcze wydana, a przy zatwierdzeniu mówią o ukryciu odniesienia do niej w dokumentach, ale poszukaj jej w przyszłości!
źródło
Miałem podobny problem z następującym kodem JavaScript:
Gdzie w skrzypku mogłem zobaczyć prośbę z:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
W rezultacie mój serwer nie mógł zmapować obiektu na typ po stronie serwera.
Po zmianie ostatniego wiersza na ten:
W skrzypaczu wciąż widziałem:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Jednak serwer zaczął zwracać to, czego się spodziewałem.
źródło
Co powiesz na swój własny adapter / opakowanie?
I niezwykle proste użycie:
źródło
Z jakiegoś powodu ustawienie typu zawartości dla żądania ajax jako sugerowanego przez @Adrien nie działa w moim przypadku. Możesz jednak zmienić typ zawartości za pomocą $ .post, robiąc to wcześniej:
Następnie
$.post
zadzwoń:Miałem problem z jQuery + IIS, i to było jedyne rozwiązanie, które pomogło jQuery zrozumieć, jak używać kodowania Windows-1252 dla żądań ajax.
źródło
możemy zmienić typ zawartości w ten sposób w $ .post
$ .post (adres URL, dane, funkcja (dane, status, xhr) {xhr.setRequestHeader („Content-type”, „application / x-www-form-urlencoded; charset = utf-8”);});
źródło
$ .post nie działa, jeśli masz problem z CORS (Cross Origin Resource Sharing). Spróbuj użyć $ .Ajax w następującym formacie: „$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, nagłówki: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', typ: 'POST', async: false, success: function (Data) {...}}); "
źródło
Nie możesz wysłać
application/json
bezpośrednio - musi to być parametr żądania GET / POST.Coś w stylu
źródło