[Client Error] status 406 Error

신창호·2022년 6월 24일
1
post-thumbnail
post-custom-banner

응답 테스트 해보기

  • 금일 알게된 Spring controller를 만들기위해,http에서 들어온 요청값을 받을 DTO를 만들어 보는 상황이었다. (아직 DTO안 만든 상태)
  • 거창한것은 아니고, 간단하게 Body에 3개의 값이 들어있는 POST요청을 받는 것이다.
  • 여기서 추가적으로, Header파일도 출력하고 싶어, 아래와 같이 코드를 짜봤다.
@RestController
@RequestMapping("/v1/members")
public class MemberController {
    @PostMapping
    public ResponseEntity postMember(@RequestHeader("user-agent") String userAgent,
                             @RequestParam("email") String email,
                             @RequestParam("name") String name,
                             @RequestParam("phoneNumber") String phone) {
        System.out.println("# userAgent = " + userAgent);
        System.out.println("# email: " + email);
        System.out.println("# name: " + name);
        System.out.println("# phone: " + phone);

        // (2) JSON 문자열 수작업을 Map 객체로 대체
        Map<String, String> map = new HashMap<>();
        map.put("email", email);
        map.put("name", name);
        map.put("phone", phone);
             // (3) 리턴 값을 ResponseEntity 객체로 변경
        return new ResponseEntity<>(new Member(email, name, phone), HttpStatus.CREATED);
    }
 }
  • 위처럼 같을 받을때, @RequestParam으로 받았지만, Member로 리턴해주고자 한다.

Member.java

public class Member {
    static String email;
    static String name;
    static String phone;
    
    public Member(String email, String name, String phone) {
        this.email = email;
        this.name = name;
        this.phone = phone;

    }
    public static String getEmail() {
        return email;
    }

    public static String getName() {
        return name;
    }

    public static String getPhone() {
        return phone;
    }
}

당연히 반환에 필요한, 생성자와 getter를 만들어 주고, spring을 실행한뒤,
http://localhost:8080/v1/members 로 POST 요청을 수행하니까, 아래와 같은 pretty가 떴다.

406에러

406에러 Not Acceptable

  • 접수할 수 없음
  • 클라이언트가 지정한 URI는 존재하지만 클라이언트가 원하는 형식이 아닐때 발생하는 에러이다.
  • 서버가 요청의 사전 콘텐츠 협상 헤더에 정의된 허용 가능한 값 목록과 일치하는 응답을 생성할 수 없으며, 서버가 기본 표현을 제공하지 않았음을 나타낸다.

즉,대부분 서버측에서 응답을 잘못준 경우라는 것이다.

406Error 나타나는 상황

  1. jackson라이브러리가 없는 경우
  • jackson라이브러리는 java JSON라이브러리이다.
  • 보통 클라이언트랑 요청과 응답을 주고받을 때 JSON타입으로 많이 주고 받는데,
    서버측에 해당 라이브러리가 없어, 제대로된 요청과 응답을 할 수 없는 경우이다.
  • 해결책으로는 라이브러리를 설치해주면 된다.
  1. Accept에 사용된 MediaType이 설정 내에 없는 경우
  • Content-Type은 데이터를 전송하는 쪽에서 데이터형식을 알려주는 헤더이고,
    Accept는 클라이언트에서 웹서버로 요청시 요청메세지에 담기는 헤더로써, 선언한 타입만 허용하겠다는 의미, 보통 레거시 스프링에서는 설정을 수정해주면 된다고 한다.
  1. 응답 타입에 Getter의 메서드가 없는 경우, 혹은 필드의 값이 없는 경우
  • 제가 해당하는 경우인데, 응답을 해주기위해, Getter메서드로 값을 추출해야되는데, Getter`의 메서드가 없어 제대로된 응답을 못해주거나,

  • 인스턴스가 생성되면서 필드의 값이 제대로된 값을 가지지 못하는 경우, Getter메서드로 값을 꺼낼수가 없을때 발생한다.

    내가 406에러가 뜨고, 서버측 콘솔을 확인해보니 아래와 같았다.

  • 제대로된 값을 찾을 수 없다는 경고문구가 나타난다.

그래서 다시한번 작성한 코드를 보니 필드의 값들이, 인스턴스 변수가 아닌,
클래스 변수(전역 변수)로 되어있어서,
static를 지워주니 해결되었다.

수정된 Member.java

public class Member {
    private String email;
    private String name;
    private String phone;


    public Member(String email, String name, String phone) {
        this.email = email;
        this.name = name;
        this.phone = phone;

    }

    public String getEmail() {
        return email;
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }
}
  • 결과값

출처
https://activeks.tistory.com/entry/ks-life

profile
한단계씩 올라가는 개발자
post-custom-banner

0개의 댓글