मैं थोड़ी देर के लिए स्वीकृत उत्तर का कोड (फेलिप का कोड) का उपयोग कर रहा हूं और यह बढ़िया काम कर रहा है (धन्यवाद, फेलिप)।
हालांकि, हाल ही में मुझे पता चला कि इसमें खाली वस्तुओं या सरणियों के साथ समस्याएं हैं। उदाहरण के लिए, इस ऑब्जेक्ट को सबमिट करते समय:
{
A: 1,
B: {
a: [ ],
},
C: [ ],
D: "2"
}
PHP B और C को बिल्कुल नहीं देखती है। यह यह हो जाता है:
[
"A" => "1",
"B" => "2"
]
Chrome में वास्तविक अनुरोध पर एक नज़र यह दिखाता है:
A: 1
:
D: 2
मैंने एक वैकल्पिक कोड स्निपेट लिखा। यह मेरे उपयोग-मामलों के साथ अच्छी तरह से काम करता है, लेकिन मैंने इसे बड़े पैमाने पर परीक्षण नहीं किया है इसलिए सावधानी के साथ उपयोग करें।
मैंने टाइपस्क्रिप्ट का उपयोग किया क्योंकि मुझे मजबूत टाइपिंग पसंद है लेकिन शुद्ध JS में बदलना आसान होगा:
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("&");
} ];
} ]);
यह फेलिप के कोड से कम कुशल है, लेकिन मुझे नहीं लगता कि यह बहुत मायने रखता है क्योंकि इसे HTTP अनुरोध के समग्र ओवरहेड की तुलना में तत्काल होना चाहिए।
अब PHP दिखाता है:
[
"A" => "1",
"B" => [
"a" => ""
],
"C" => "",
"D" => "2"
]
जहाँ तक मुझे पता है कि PHP को यह पहचानना संभव नहीं है कि बा और सी खाली सरणियाँ हैं, लेकिन कम से कम कुंजियाँ दिखाई देती हैं, जो महत्वपूर्ण है जब कोड होता है जो एक निश्चित संरचना पर निर्भर करता है, तब भी जब यह अनिवार्य रूप से खाली होता है।
यह भी ध्यान दें कि यह अपरिभाषित एस और नल एस को खाली तारों में परिवर्तित करता है ।