나는 받아 들여진 답변 코드 (Felipe의 코드)를 잠시 동안 사용해 왔으며 훌륭하게 작동했습니다 (감사합니다, Felipe!).
그러나 최근에 빈 객체 또는 배열에 문제가 있음을 발견했습니다. 예를 들어,이 객체를 제출할 때 :
{
A: 1,
B: {
a: [ ],
},
C: [ ],
D: "2"
}
PHP는 B와 C를 전혀 보지 못하는 것 같습니다. 그것은 이것을 얻는다 :
[
"A" => "1",
"B" => "2"
]
Chrome의 실제 요청을 보면 다음과 같습니다.
A: 1
:
D: 2
대체 코드 스 니펫을 작성했습니다. 내 유스 케이스에서 잘 작동하는 것 같지만 광범위하게 테스트하지 않았으므로주의해서 사용하십시오.
강력한 타이핑을 좋아하기 때문에 TypeScript를 사용했지만 순수한 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("&");
} ];
} ]);
Felipe의 코드보다 효율적이지 않지만 HTTP 요청 자체의 전체 오버 헤드와 비교하여 즉각적으로 이루어져야하기 때문에 중요하지 않다고 생각합니다.
이제 PHP는 다음을 보여줍니다.
[
"A" => "1",
"B" => [
"a" => ""
],
"C" => "",
"D" => "2"
]
내가 아는 한 PHP가 Ba와 C가 빈 배열임을 인식하는 것은 불가능하지만 적어도 키가 나타납니다. 이것은 본질적으로 비어있는 경우에도 특정 구조에 의존하는 코드가있을 때 중요합니다.
또한 정의되지 않은 s 및 null 을 빈 문자열 로 변환 합니다.