Bir süredir kabul edilen cevap kodunu (Felipe'nin kodu) kullanıyorum ve harika çalışıyor (teşekkürler Felipe!).
Ancak, son zamanlarda boş nesneler veya dizilerle ilgili sorunları olduğunu keşfettim. Örneğin, bu nesneyi gönderirken:
{
A: 1,
B: {
a: [ ],
},
C: [ ],
D: "2"
}
PHP, B ve C'yi hiç görmüyor. Bunu alır:
[
"A" => "1",
"B" => "2"
]
Chrome'daki asıl talebe bir göz attığınızda şunu gösterir:
A: 1
:
D: 2
Alternatif bir kod pasajı yazdım. Kullanım durumlarımda iyi çalışıyor gibi görünüyor ama kapsamlı bir şekilde test etmedim, bu yüzden dikkatli kullanın.
Güçlü yazmayı sevdiğim için TypeScript kullandım, ancak saf JS'ye dönüştürmek kolay olurdu:
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("&");
} ];
} ]);
Felipe'nin kodundan daha az verimlidir, ancak HTTP isteğinin genel yüküne kıyasla hemen olması gerektiği için çok önemli olduğunu düşünmüyorum.
Şimdi PHP gösteriyor:
[
"A" => "1",
"B" => [
"a" => ""
],
"C" => "",
"D" => "2"
]
Bildiğim kadarıyla PHP'nin Ba ve C'nin boş diziler olduğunu tanımasını sağlamak mümkün değil, ama en azından anahtarlar ortaya çıkıyor, bu da aslında içeride boş olsa bile belirli bir yapıya dayanan bir kod olduğunda önemlidir.
Ayrıca undefined ve null değerlerini boş dizelere dönüştürdüğünü de unutmayın .