programing

XMLHttpRequest.responseType 설정이 갑자기 금지되었습니까?

lovejava 2023. 8. 22. 21:43

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)

레퍼런스

설정이 불가능하기 때문에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