아델
688
2020-09-26 18:02:55 작성 2020-09-26 18:44:15 수정됨
6
257

포스트맨으로 요청보내기 form-data vs jaw(JSON) 차이


포스트맨으로 GET요청을 보내서 로그인 테스트를 하고있습니다




이 요청을 성공하는데 


이 요청은 실패합니다


이유가 뭔지 잘 모르겠습니다.

0
  • 답변 6

  • 공부는 습관
    416
    2020-09-26 18:57:44

    response의 code를 보시고 원인을 분석해보세요.

    form-data와 json은 요청을 보낼 때 Header 속성 중 Content-Type이 다른데 그 이유일 수도 있겠네요.

  • 아델
    688
    2020-09-26 19:20:34

    공부는 습관
    NPE 발생하고요

    후자의 경우 consumes 타입 application/json으로 줘도 에러 발생하네요 

  • Mambo
    5k
    2020-09-26 19:24:42

    윗분 말씀대로 Content-Type에 따라 보내진 데이터를 요청 핸들러 함수에서 매개변수에 대한 바인딩 방식을 알아보셔야합니다. 위 정보만으로는 작성자님이 어떤 방식으로 데이터 바인딩을 시도하고 있는지 알 수 없습니다.

  • 아델
    688
    2020-09-26 19:46:29 작성 2020-09-26 19:47:20 수정됨

    Mambo

    정보가 많이 부족했던거 같습니다. 아래 처럼 전달받고 있어요 



     @GetMapping("/login")
        public String loginString name,String pw){
            System.out.println(name+pw);
            Optional<Memberoptional=memberRepo.findByName(name);
            String encodedoptional.map(Member::getPw).orElse("empty");
            if(pw.equals(encoded)){
                String jwt=jwtService.createJwt(name);
                log.info(String.format("%s logined %s is delivered",name,jwt));
                return jwt;
            }
            return "false";
        }



    p.s json으로 하면 null이 전달되네요 
  • xxrcn11
    1k
    2020-09-26 21:41:45

    form-data로 전송할 경우 HttpServletRequest를 이용해서 (자동으로) name과 pw에 값을 설정합니다

    하지만 json 방식으로 보낼때는 매개변수가 Object 형태여야 합니다

    즉, Jackson이 전달된 데이터를 파싱하여 Object의 필드에 설정하는 방식입니다.


    매개변수에 다음과 같은 object를 설정하면 둘 다 사용가능합니다


    public class LoginInfo {
        private String i;
        private String pw;
        .... getter, setter 설정
    }
  • 아델
    688
    2020-09-26 23:44:05 작성 2020-09-26 23:44:34 수정됨

    xxrcn11 

     감사합니다

    근데 둘 다 사용못하는거 같습니다 

    @GetMapping("asd")
    public void asd(@RequestBody LoginInfo dto){
    
    System.out.println(dto); }

    @RequestBody를 붙이면 json으로 전달이 가능한데

    없으면 불가능하고 form-data 방식만 가능하네요

  • 로그인을 하시면 답변 을 등록할 수 있습니다.