(위 사진은 chrome.webRequest의 Life cycle of requests이다)
의문점들은
지원서 결과 확인 매크로
를 만들기 위해 네트워크 요청을 분석하다 결론적으로 XMLHttpRequest만을 매크로로 기억되도록 필터 조건을 걸면서 시작되었다.
먼저 자바스크립트를 활용한 비동기 통신이 대제목이라고 볼 수 있다.
XMLHttpRequest
를 검색했을 때, MDN Web Docs 내 Ajax 시작하기가 등장한다. 자바스크립트의 비동기 통신에 대해 알아보는 첫 단계로 AJAX를 알아보자.+a blob → binary large object
그렇다면, 자바스크립트로 AJAX를 구현한 코드를 살펴보자.
// 출처 -> https://m.blog.naver.com/altmshfkgudtjr/221939445527
var xmlhttp;
document.getElementById("ajaxBtn").addEventListener('click', makeRequest);
function makeRequest() {
// 1. XMLHttpRequest 객체를 생성
xmlhttp = new XMLHttpRequest();
// 2. 서버로 보낸 요청에 대한 응답을 받았을 때 동작할 함수
xmlhttp.onreadystatechange = Callback;
// 3. open(method, url, async or sync)
xmlhttp.open('POST', < API URL >, true);
var data = {'name': 'chanyoung'};
// +a 4. setting header
xmlhttp.setRequestHeader('Content-Type', 'application/json');
// 5. 파라미터는 POST 방식으로 요구한 경우 서버로 보내고 싶은 어떠한 데이터
// multipart/form-data, JSON, XML, SOAP 등과 같은 다른 형식(format)도 가능
xmlhttp.send(JSON.stringify(data));
}
// 서버 응답에 대한 처리
function Callback() {
try {
if (xmlhttp.readyState === XMLHttpRequest.DONE) {
if (xmlhttp.status === 200) {
console.log("성공: ", xmlhttp.responseText);
} else {
console.log("실패");
}
}
} catch (e) {
console.log("에러: ", e);
}
}
Fetch API는 네트워크 통신을 포함한 리소스 취득을 위한 인터페이스가 정의되어 있습니다. XMLHttpRequest와 같은 비슷한 API가 존재합니다만, 새로운 Fetch API는 좀더 강력하고 유연한 조작이 가능합니다.
// 출처 -> https://m.blog.naver.com/altmshfkgudtjr/221939445527
let data = new FormData();
data.append('name', 'NB');
fetch(<API URL>, {
method: 'POST',
header: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
// etc..
}).then(res => res.json())
.then((res)=> {
console.log(JSON.stringify(res));
}).catch((err)=> {
console.log("에러: ", err);
});
참 잘 정리된 링크 > ECMAScript 6 Promise와 비동기 프로그램밍
간단하게 정리하면,
// readFile은 미래의 어떤 시점에서 완료할 것을 약속합니다.
let promise = readFile("example.txt");
// 출처 - https://infoscis.github.io
// Node.js example
let fs = require("fs");
function readFile(filename) {
return new Promise(function(resolve, reject) {
// 비동기 동작 트리거
fs.readFile(filename, { encoding: "utf8" }, function(err, contents) {
// check for errors
if (err) {
reject(err);
return;
}
// the read succeeded
resolve(contents);
});
});
}
let promise = readFile("example.txt");
// 수행과 거절 모두를 처리한다.
promise.then(function(contents) {
// 수행
console.log(contents);
}, function(err) {
// 거절
console.error(err.message);
});
자바스크립트를 활용한 비동기 프로그래밍에 대해 조금 익혔다.
매크로로 기억될 네트워크 송수신을 필터링 하는 과정에서 어떤 조건으로 해야할 지 고민이었다. 보통 HTML 파일을 받고, 필요한 리소스를 요청하는 것과 POST 요청을 통해 인증이나 쿠키를 받는 요청 그리고 리다이렉트 요청도 있다.
각각 어떤 조건으로 구별할 지 배경지식이 없던 와중에 이번 분석을 통해 조금이나마 감을 익혔다.
물론 현재 chrome.webRequest가 request 및 response를 처리하는 프로세스 내에 listener를 추가하여 request 및 response의 details 내 type으로 필터링을 하고 있지만, 이는 이 request에 종속적인 방법임을 깨닫는다. 특히 xmlhttprequest가 아닌 다른 객체 요청으로 변경될 가능성이 크다.
따라서 더 나은 방법이라면 request와 response를 묶어 객체에 저장하여 response 내 Content-Type을 통해 필터링을 하는 방법이 더 낫지 않나 싶다.