dojo1.7에서 작업 중입니다. 나는 아약스 반환에서 얻는 다중 부분 응답을 구문 분석하고 싶다.
어떻게 할 수 있습니까? 누군가 나에게 제안 할 수 있습니까?
미리 감사드립니다!dojo에서 다중 부분 응답을 구문 분석하는 방법
0
A
답변
1
Dojo는 기본적으로이 작업을 수행하지 않을 것이라고 생각합니다. 클라이언트에서 멀티 파트를 처리하는 것은 일반적이 아닙니다. multipart-mime에 대한 고유 한 XHR 처리기를 만들어야합니다.
는 접촉 식 제목에 지정된 경계에서 내용을 분할 :eg.
Content-Type: multipart/form-data; boundary=AaB03x
이러한 부분을 분할 자바 스크립트에 간단한
사항 String.split (<REGX>)을 사용할 수 있습니다
. 그런 다음 개별 부분을 구문 분석해야합니다. 각 파트에는 고유 한 머리글 세트가 있고 내용은 Content-Type의 형식에 따라 인코딩됩니다.
첨부 파일을받는 경우 base64 인코딩을 사용하고있는 것 같습니다. 따라서 디코딩도해야합니다.
Dojo Base64 Encode/Decode당신이 (당신이 그것을로드 한 후) 당신이 참고 표준의 XHR 호출에서 핸들러를 소유하고 사용하는 방법
- .
여기서 "mylib/multipart"에서로드 된 "multipart"라는 사용자 정의 처리기를 사용했습니다. Dojo를 사용하면 스크립트에서 수신 한 데이터를 구문 분석하기 위해 핸들러를로드하고로드 할 수 있습니다.
NB : 브라우저의 보안으로 인해로드하는 페이지와 동일한 URL에있는 경우에만 XHR을 통해 데이터를로드 할 수 있습니다. (참조 : Stackoverflow conversation).
나는 아래의 예를 들어 다중 처리기를 만들었습니다
require([ "dojo/_base/xhr", "dojo/_base/array", "dojo/_base/lang" ], function(xhr, array, lang){ lang.mixin(xhr.contentHandlers, { "multipart": function(response){ var parser = { parse: function(response){ var parts = new Array(); var boundary = parser._getBoundary(response); if(boundary){ parts = parser._getParts( response.responseText, boundary ); } return parts; // return empty array if parsing could not be done }, _getBoundary: function(response){ var contentType = response.getResponseHeader("Content-Type"); if(/boundary\=/.test(contentType)){ var parse = /boundary\=(.*?)(;|$)/.exec(contentType); return parse[1]; } return false; // Return false if no boundary found }, _getParts: function(text, boundary){ var parsed = new Array(); var splitter =new RegExp(boundary+"[\r\n]+","g"); var parts = text.split(splitter); // Split at the boundary array.forEach(parts, function(part){ var headBody = part.split("\n\n"); if(headBody.length > 0){ var head = lang.trim(headBody[0]); var body = headBody[1]; if(head != ""){ // Don't parse if no header, probably an error parsed.push({ "head": parser._parseHeaders(head), "body":body }); } } }, this); return parsed; }, _parseHeaders: function(headerText){ // Headers should be in format: Header: Value var header = {}; var lines = headerText.split(/[\r\n]/); array.forEach(lines, function(line){ var parts = line.split(":"); if(parts.length > 0){ header[lang.trim(parts[0])] = lang.trim(parts[1]); } }, this); return header; } }; return parser.parse(response); } }); });
이 콘텐츠 객체의 배열로 XHR에서 반환 된 텍스트를 구문 분석합니다. 각 콘텐츠 개체는 원본 텍스트 본문이 포함 된 본문 특성과 머리글 개체가 포함 된 머리 특성을 포함해야합니다.
일반 텍스트가 아닌 원시 컨텐트를 처리하려면 추가 코드를 작성해야합니다. 모든 상황에서 작동하는지 확인하기 위해 많은 테스트 데이터를 던질 수도 있습니다.