Ich habe den Code der akzeptierten Antwort (Felipes Code) für eine Weile verwendet und er hat großartig funktioniert (danke, Felipe!).
Kürzlich habe ich jedoch festgestellt, dass es Probleme mit leeren Objekten oder Arrays gibt. Zum Beispiel beim Senden dieses Objekts:
{
A: 1,
B: {
a: [ ],
},
C: [ ],
D: "2"
}
PHP scheint B und C überhaupt nicht zu sehen. Es bekommt das:
[
"A" => "1",
"B" => "2"
]
Ein Blick auf die aktuelle Anfrage in Chrome zeigt Folgendes:
A: 1
:
D: 2
Ich habe ein alternatives Code-Snippet geschrieben. Es scheint gut mit meinen Anwendungsfällen zu funktionieren, aber ich habe es nicht ausgiebig getestet. Verwenden Sie es daher mit Vorsicht.
Ich habe TypeScript verwendet, weil ich starkes Tippen mag, aber es wäre einfach, in reines JS zu konvertieren:
angular.module("MyModule").config([ "$httpProvider", function($httpProvider: ng.IHttpProvider) {
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
function phpize(obj: Object | any[], depth: number = 1): string[] {
var arr: string[] = [ ];
angular.forEach(obj, (value: any, key: string) => {
if (angular.isObject(value) || angular.isArray(value)) {
var arrInner: string[] = phpize(value, depth + 1);
var tmpKey: string;
var encodedKey = encodeURIComponent(key);
if (depth == 1) tmpKey = encodedKey;
else tmpKey = `[${encodedKey}]`;
if (arrInner.length == 0) {
arr.push(`${tmpKey}=`);
}
else {
arr = arr.concat(arrInner.map(inner => `${tmpKey}${inner}`));
}
}
else {
var encodedKey = encodeURIComponent(key);
var encodedValue;
if (angular.isUndefined(value) || value === null) encodedValue = "";
else encodedValue = encodeURIComponent(value);
if (depth == 1) {
arr.push(`${encodedKey}=${encodedValue}`);
}
else {
arr.push(`[${encodedKey}]=${encodedValue}`);
}
}
});
return arr;
}
// Override $http service's default transformRequest
(<any>$httpProvider.defaults).transformRequest = [ function(data: any) {
if (!angular.isObject(data) || data.toString() == "[object File]") return data;
return phpize(data).join("&");
} ];
} ]);
Es ist weniger effizient als Felipes Code, aber ich denke nicht, dass es wichtig ist, da es im Vergleich zum Gesamtaufwand der HTTP-Anfrage selbst sofort erfolgen sollte.
Jetzt zeigt PHP:
[
"A" => "1",
"B" => [
"a" => ""
],
"C" => "",
"D" => "2"
]
Soweit ich weiß, ist es nicht möglich, PHP dazu zu bringen, zu erkennen, dass Ba und C leere Arrays sind, aber zumindest die Schlüssel erscheinen, was wichtig ist, wenn es Code gibt, der auf einer bestimmten Struktur beruht, selbst wenn er im Wesentlichen leer ist.
Beachten Sie auch, dass undefinierte s und null s in leere Zeichenfolgen konvertiert werden .