Fetch API 사용시 redirect 이슈 해결하기

adam2·2019년 12월 25일
1

⚠️에러사전⚠️

목록 보기
3/4
post-thumbnail

이슈

fetch API를 이용해 프론트에서 서버로 요청을 보내고 서버에서 리다이렉팅 하도록 구현하였다.
하지만 브라우저로 리다이렉팅한 path의 response는 넘어오지만(200) 리다이렉팅한 페이지로 화면이 넘어가지 않았다.

const response = await fetch(url, {
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, *cors, same-origin
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, *same-origin, omit
    headers: {
      'Content-Type': 'application/json'
      // 'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // no-referrer, *client
    body: JSON.stringify(data) // body data type must match "Content-Type" header
  });
  return await response.json(); // parses JSON response into native JavaScript objects

헤더 설정 중 redirect 프로퍼티가 있는데

  • manual : 리다이렉트를 허용하지 않는다.
  • error : 리다이렉트 응답을 에러로 처리한다.
  • follow : 리다이렉트 응답을 허용한다. (HTTP status code = 301,302,303,307,308)

이중 follow 속성을 사용했음에도 리다이렉트 화면으로 넘어가지 않았다.

해결

fetch는 바로 redirect된 페이지로 이동이 안된다고 한다.(이유는 아직 모르겠다)
그래서 redirect response가 왔을 때 다시 한번 해당 url로 요청을 보내야한다.

response속성 중 redirected라는 프로퍼티로 redirect 여부를 검사한다.
response.redirected가 true일 경우,
window.location.href \= response.url
response.redirect(response.url)
둘 중 하나의 방법으로 다시 요청을 한다.

결론

fetch API에 생각보다 많은 제약이 있는 것 같다. HTTP Method 중에도 지원하지 않는 것들도 있고,,,(예를 들어 UPDATE같은,,)
다음 프로젝트에선 axios를 공부해서 적용해봐야겠다

3개의 댓글

comment-user-thumbnail
2021년 7월 21일

저도 지금 같은 문제로 막혔습니다 ㅠㅠ 혹시 지금은 해결 하셨나요?
전 지금 로그인 form데이터를 json으로 보내려고 fetch를 사용하는 중인데 서버에서 alert를 하던 redirect를 하던 클라이언트 브라우전에선 반응이 없더라고요 (postman으로 확인하면 response가 넘어오긴한데...)
jquery나 ajax?를 쓰면 어거지로 해결할 순 있을거 같은데 그헐게는 하고 싶지않네요.
혹시 다른 방법을 찾으셨거나 axios로 해결하셨나요?

답글 달기
comment-user-thumbnail
2022년 5월 26일

저의 경우 요청 받은 response에서 redirected 되었는지를 파악하고, 맞다면 window.location.href = response.url 을 통해서 리다이렉트 되도록 하였습니다만, 역시 사소한 제약이 많아 보입니다. axios 사용을 고려해야겠네요.

답글 달기
comment-user-thumbnail
2023년 5월 18일

덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.

답글 달기