출처: MDN
https://developer.mozilla.org/ko/docs/Web/API/Fetch_API/Fetch%EC%9D%98_%EC%82%AC%EC%9A%A9%EB%B2%95
Fetch API를 이용하면 Request나 Response와 같은 HTTP의 파이프라인을 구성하는 요소를 조작하는 것이 가능하다. 또한 fetch() 메서드를 이용하는 것으로 비동기 네트워크 통신을 알기 쉽게 기술할 수 있다.
Fetch의 기본 스펙은 jQuery.ajax()와 기본적으로 두 가지가 다르다는 사실에 유념해야 한다.
fetch()로 부터 반환되는 Promise 객체는 HTTP error 상태를 reject 하지 않는다.
(HTTP Status Code가 404나 500을 반환하더라도) 대신 ok 상태가 false인 resolve가 반환되며,
네트워크 장애나 요청이 완료되지 못한 상태에는 reject가 반환된다.
보통 fetch는 쿠키를 보내거나 받지 않는다. 사이트에서 사용자 세션을 유지 관리해야하는 경우
인증되지 않는 요청이 발생한다. 쿠키를 전송하기 위해서는 자격증명(credentials) 옵션을 반드시 설정해야 한다.(토큰인듯)
코드 예시
fetch('http://example.com/movies.json')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(JSON.stringify(myJson));
});
네트워크에서 JSON 파일을 가져와서 콘솔에 인쇄한다. 간단한 fetch() 사용 흐름은 인수 한개(가져올 자원의 경로)를 가져오고 응답을 포함하는 약속(Response 개체)을 반환하는 것이다.
이것은 단순한 HTTP Response이며, 실제 JSON이 아니다. response 객체로부터 사진(?)을 가져오기 위해서는 json() 메서드를 사용할 필요가 있다.
login =() => {
fetch('http://10.58.xxx:8000/user/login/', {
method: "POST",
headers: {
'Content-type' : 'application/json'
},
body: JSON.stringify({
name: this.state.name,
password: this.state.password
})
})
.then(response => response.json())
.then(response => {console.log(response);
}
fetch 메서드를 사용하기 위해서는 기본적으로 인자를 하나만(API 주소) 두고 사용할 수 있지만, 원하는 결과를 위해서는 header와 body에 정확한 내용을 기입하여 사용해야한다.
그러나 기입하는 내용이 생각보다 길기 때문에 fetch가 필요한 상황마다 작성하는 것은 매우 소모적?이다. 따라서 fetch(get하는) 메서드를 함수로 지정하여 필요할 때 마다 사용하는 것이 좋다.
function getFunction =() => {
fetch(API 주소, 필요한 정보들)
}
이렇게 작성했을 때 장점은 재활용이 가능하다는 점이다. 무엇보다 편리하다.
예를 들어, fetch(post)를 쓰고 fetch(get) 해야하는 상황을 생각해보자.
댓글을 단다고 했을 때. 댓글을 올리면 데이터를 데이터베이스에 "POST"하고
그 데이터가 저장된 새로운 데이터를 "GET" 해야할 때,
fetch(get)을 함수로 지정하지 않았다면 매우 긴 함수 정의 코드를 작성해야하지만
미리 함수로 지정해놓았다면 다음과 같이 사용할 수 있다.
fucntion handlePost(API 주소, 인자 (method:"post")
이후 생략
.then(response => response.json())
.then(this.getFunction)