여러 개의 이름이 같은 필드를 포함하는 요청은 jQuery입니다.aax로 못 던지는 말과 촌스러운 해결 방법.

14191 단어 jQueryJavaScript
구글 Closure Compiler의 REST API 코드를 Python에서 JS로 바꿨을 때 빠져서 비망록

원본 코드


원래 움직이는 소스는 이렇게 만들어서 던져달라고 했어요.
jsCode에 컴파일된 객체의 Javascript 문자열이 이미 포함되어 있다고 가정합니다.
params = urllib.urlencode([
        ('js_code',jsCode),
        ('compilation_level', 'SIMPLE_OPTIMIZATIONS'),
        ('output_format', 'json'),
        ('output_info', 'compiled_code'),
        ('output_info', 'warnings'),
        ('output_info', 'errors'),
        ])

headers = { "Content-type": "application/x-www-form-urlencoded" }
conn = httplib.HTTPConnection('closure-compiler.appspot.com')
conn.request('POST', '/compile', params, headers)
response = conn.getresponse()
data = response.read()
conn.close()
여기에는 "output_info"매개 변수 3개가 있습니다. 요청에서 이러한 느낌입니다.

대상 코드 - 오류 예제(JavaScript)


JS에 다시 쓴 거.브라우저에서 실행되기 때문에 jQuery를 사용합니다.
(node.js의 http로 쓰고 싶어도 얼마 안 남았어요.)
var params = {
    "js_code" : jsCode,
    "compilation_level": "SIMPLE_OPTIMIZATIONS",
    "output_format": "json",
    "output_info": ["compiled_code", "warnings", "errors"]
};
$.ajax({
    url : "http://closure-compiler.appspot.com/compile",
    type : "POST",
    contentType : "application/x-www-form-urlencoded",
    data : params,
    dataType : "json"
}).done(function(res){...}).fail(function(e){...});
이런 느낌이에요, output_info 배열.select 같은 흔한 패턴이지만 Closure Compler 씨가 민감하기 때문에 잘못된 것입니다.
구체적으로 "ServerError"는 "output_info[]"와 같은 매개변수를 모른다고 반환됩니다. 다시 시작합니다.

대상 코드 마이그레이션 - 흙 냄새 제거 예제(JavaScript)


공식 문서를 많이 봤지만 관건적인 해결 방법을 찾지 못해 기본으로 돌아가 스스로 서열화했다.
var params = [
    { key : "js_code",           val : jsCode },
    { key : "compilation_level", val : "SIMPLE_OPTIMIZATIONS" },
    { key : "output_format",     val : "json" },
    { key : "output_info",       val : "compiled_code" },
    { key : "output_info",       val : "warnings" },
    { key : "output_info",       val : "errors" }
];
paramStr = $.map(params, function(n){
    return encodeURIComponent(n.key) + "=" + encodeURIComponent( n.val )
}).join("&").replace(/%20/g, "+");

$.ajax({
    url : "http://closure-compiler.appspot.com/compile",
    type : "POST",
    contentType : "application/x-www-form-urlencoded",
    data : paramStr,
    processData : false,
    dataType : "json"
}).done(function(res){...}).fail(function(e){...});
진흙 냄새가 나지만 이게 움직인다.

아무튼 반갑습니다.
하지만 시원치 않아요.

(2/20 추적) 정답


smzk씨에게서 정보를 받았습니다.1.4부터 추가된traditional 옵션을 사용하면 서열화할 때의 깊이 성형 처리가 아니라 낡은 형식으로 제공된다.
var params = [
    { key : "js_code",           val : jsCode },
    { key : "compilation_level", val : "SIMPLE_OPTIMIZATIONS" },
    { key : "output_format",     val : "json" },
    { key : "output_info",       val : "compiled_code" },
    { key : "output_info",       val : "warnings" },
    { key : "output_info",       val : "errors" }
];
paramStr = $.param(params, true);//traditionalオプション付きでシリアライズ

길기 때문에 그에 상응하는 곳만 있다.
아니오, 시원해요.

좋은 웹페이지 즐겨찾기