Czy ktoś może w prosty sposób wyjaśnić, jak sprawić, by jQuery wysyłał rzeczywisty JSON zamiast ciągu zapytania?
$.ajax({
url : url,
dataType : 'json', // I was pretty sure this would do the trick
data : data,
type : 'POST',
complete : callback // etc
});
W rzeczywistości spowoduje to konwersję starannie przygotowanego kodu JSON na ciąg zapytania. Jedną z denerwujących rzeczy jest to, że każdy obiekt array: []
w twoim obiekcie zostanie przekonwertowany array[]: []
, prawdopodobnie z powodu ograniczeń żądań zapytania.
javascript
jquery
json
query-string
Redsandro
źródło
źródło
dataType
ma to wpływu na sposób przesyłania danych. Określa jedynie, jakiego typu dane mają być zwrócone przez wywołanie. Jeśli chcesz wskazać serwerowi, jaki typ danych określasz wedata
właściwości, musisz ustawićcontentType
właściwość podobnie jakcontentType: "application/json"
Odpowiedzi:
Musisz
JSON.stringify
najpierw serializować obiekt do formatu JSON, a następnie określić,contentType
aby serwer zrozumiał, że to JSON. To powinno załatwić sprawę:Należy pamiętać, że
JSON
obiekt jest natywnie dostępny w przeglądarkach obsługujących JavaScript 1.7 / ECMAScript 5 lub nowszy. Jeśli potrzebujesz starszej obsługi, możesz użyć json2 .źródło
contentType: 'application/json'
.POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
$_POST
php widać tylkoapplication/x-www-form-urlencoded
, że jeśli chcesz odczytać dane json, musisz to zrobićfile_get_contents("php://input")
i być może wtedy ajson_decode()
Nie,
dataType
opcja służy do analizowania odebranych danych.Aby opublikować kod JSON, musisz samodzielnie go zdefiniować za pośrednictwem
JSON.stringify
i ustawićprocessData
opcję nafalse
.Zwróć uwagę, że nie wszystkie przeglądarki obsługują ten
JSON
obiekt i chociaż jQuery to obsługuje.parseJSON
, nie zawiera on stringifier; będziesz potrzebować innej biblioteki polyfill.źródło
processData
nafalse
nie jest konieczne, ponieważJSON.stringify
już zwraca ciąg.encodeURIComponent
ed, prawda?Chociaż wiem, że wiele architektur, takich jak ASP.NET MVC, ma wbudowaną funkcjonalność do obsługi JSON.stringify jako contentType, moja sytuacja jest trochę inna, więc może to może pomóc komuś w przyszłości. Wiem, że zaoszczędziłoby mi to godziny!
Ponieważ moje żądania http są obsługiwane przez interfejs API CGI z IBM (środowisko AS400) w innej subdomenie, żądania te są pochodzenia krzyżowego, stąd plik jsonp. Właściwie wysyłam mój Ajax za pośrednictwem obiektów javascript. Oto przykład mojego POST Ajax:
źródło
Jeśli odsyłasz to z powrotem do asp.net i potrzebujesz danych w request.form [], musisz ustawić typ zawartości na „application / x-www-form-urlencoded; charset = utf-8”
Oryginalny post tutaj
Po drugie, pozbądź się typu danych, jeśli nie spodziewasz się powrotu, POST będzie czekał około 4 minuty, zanim zakończy się niepowodzeniem. Zobacz tutaj
źródło