XMLHttpRequest.responseType 설정이 갑자기 금지되었습니까?
저는 이진 파일을 로드하고 로드될 때까지 대기하기 위해 responseType이 "arraybuffer"로 설정된 동기식 XMLHttpRequest를 꽤 오랫동안 사용했습니다.오늘 다음 오류가 발생했습니다. "Die Verwendung des responseType-Attributes von XMLHttpRequest wirdim synchronen Modusim window-Kontektnichtmehrunterstützt". 이는 "윈도 컨텍스트에서 동기 모드로 XMLHtpRequest에 대한 응답 유형 사용(더 이상 지원되지 않음)"으로 해석됩니다.
이거 어떻게 고치는지 아는 사람?저는 이런 일에 비동기식 요청을 사용하고 싶지 않습니다.
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';
크롬에서 잘 작동합니다.
XMLHttpRequest 사양에 정의된 대로 올바른 동작입니다.
When set: 동기 플래그가 설정되어 있고 관련 XMLHttpRequest 문서가 있는 경우 예외가 발생합니다.
그responseType
속성을 설정할 수 없습니다.XMLHttpRequest
비동기가 아닙니다. 즉, 동기입니다.세 번째 파라미터 설정open
로.false
요청을 동기화합니다.
해결 방법
일반 판독기의 경우 동기화 동작이 여전히 필요한 경우 콘텐츠를 문자열로 다운로드한 다음 바이트 데이터로 변환할 수 있습니다.
참고:
이 해결 방법은 원본을 가정합니다.request.response
이다.ASCII
본문.
이 가정이 특정 사용 사례에 맞지 않으면 jBinary를 참조하십시오.
로 변환합니다.ArrayBuffer
.
var request = new XMLHttpRequest();
request.open('GET', url, false);
request.send(null);
var data;
if (request.status === 200) {
data = stringToArrayBuffer(request.response);
} else {
alert('Something bad happen!\n(' + request.status + ') ' + request.statusText);
}
// ...
function stringToArrayBuffer(str) {
var buf = new ArrayBuffer(str.length);
var bufView = new Uint8Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
더 읽기
- jBinary:Javascript에서 이진 데이터 작업을 위한 고급 API입니다.
- 바이너리 데이터 송수신 : 바닐라 자바스크립트를 이용한 바이너리 데이터 처리 (출처 : Mozilla Developer Network)
레퍼런스
- 문자열과 어레이 버퍼 간 변환
- Renato Mangini의 원래 기능 str2ab.
- Encoding API(Jeff Posnik)를 사용하여 보다 쉬운 ArrayBuffer <-> 문자열 변환
설정이 불가능하기 때문에responseType = 'arraybuffer'
동기화 모드에서는 문자열을 수신하고 바이트로 변환하는 것이 해결책이지만 Stephan이 말했듯이 데이터는 ASCII 텍스트여야 합니다.127바이트 이상의 모든 바이트 대신 잘못된 값(253)을 받게 됩니다.
하지만 설정mime-type
으로 설정합니다.x-user-defined
해결책이 될 수 있습니다.
여기서 서버는 125에서 134까지 10바이트를 전송합니다.
request = new XMLHttpRequest();
request.overrideMimeType('text/plain; charset=x-user-defined');
request.open('GET', url, false);
request.send();
Uint8Array.from(request.response, c => c.charCodeAt(0));
> Uint8Array(10) [125, 126, 127, 128, 129, 130, 131, 132, 133, 134]
mime-type을 설정하지 않으면 다음과 같습니다.
request = new XMLHttpRequest();
request.open('GET', url, false);
request.send();
Uint8Array.from(request.response, c => c.charCodeAt(0));
> Uint8Array(10) [125, 126, 127, 253, 253, 253, 253, 253, 253, 253]
여러분이 전체, ▁an▁the▁thing▁if▁wrapping▁with▁whole오▁consider보시,십▁over것▁of▁you고해▁enough▁the▁point로 포장하는 것을 고려해보세요.async
및 사용하기await
문제가 있는 비동기 코드를 차단합니다.모든 사용 사례에서 작동하지 않을 수도 있습니다.
(async function () {
await problem_function_1();
await problem_function_2();
... normal page logic pasted here ...
})();
는 속이아비래핑합다니코드를약기동으로 .Promise
(예상대로 작동하도록 대기), 그리고 "성공 콜백"을 구성하는 어떤 경우든 수동으로 해결 함수를 호출합니다.가능한 경우 거부에도 동일한 작업을 수행합니다.
언급URL : https://stackoverflow.com/questions/9855127/setting-xmlhttprequest-responsetype-forbidden-all-of-a-sudden
'programing' 카테고리의 다른 글
jquery를 사용하여 스크롤바가 없는 브라우저 뷰포트의 높이와 너비를 가져오시겠습니까? (0) | 2023.08.27 |
---|---|
Spring MVC - 날짜 필드 바인딩 (0) | 2023.08.27 |
하위 요소에 영향을 주지 않고 배경 이미지의 불투명도 설정 (0) | 2023.08.22 |
민달팽이란 무엇입니까? (0) | 2023.08.22 |
C 프로그래밍의 고정점 연산 (0) | 2023.08.22 |