일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 부스트코스
- flutter network call
- 안드로이드 sunflower
- 막내의 막무가내 알고리즘
- 막내의막무가내 SQL
- 부스트코스에이스
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 알고리즘
- 막내의막무가내 플러터
- Fragment
- 주엽역 생활맥주
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 코볼 COBOL
- 막무가내
- 막내의막무가내 일상
- 막내의막무가내 rxjava
- 프로그래머스 알고리즘
- 막내의막무가내 플러터 flutter
- 안드로이드
- 막내의막무가내 목표 및 회고
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 코틀린
- 막내의막무가내 프로그래밍
- 2022년 6월 일상
- 프래그먼트
- 막내의막무가내 안드로이드
- 막내의막무가내
- 막내의 막무가내
- 안드로이드 Sunflower 스터디
- 주택가 잠실새내
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] Retrofit2 @Body @Field 차이 본문
프로젝트에서 AWS와 노드로 서버를 구성하고
안드로이드 클라이언트 Retrofit2 통신에서 평소 @Field를 사용했는데, 계속 Json으로 서버에서 못받고 이상한 값이 넘어오는 현상이발생했다.
서버문제인지 클라이언트의 모델 문제인지 무슨 문제인지!!!!!! 삽질을 꽤 오래하고 틀리지도 않는 부분을 고쳐댔다........
(에러도 안나고 서버쪽에 값이 이상하게 들어가기만해서 몇줄이 틀렸는지 알 수가 없었다.ㅠ.ㅠ)
원인은 Retrofit2 인터페이스가 잘못되었었다. 먼저 요점만 말하면 @Field가 아니라 @Body를 사용해야했다. 덕분에 둘의 차이점을 알아보는 시간을 가지고 포스팅을 하게 되었다.
사건 배경(처음에 실수한 코드 사진)
밑과 같이 Json으로 보낼려고 했다.
(DTO, POJO)
Routes 클래스이다. Routes객체의 리스트를 갖고있다.
Route이다. 실질적인 값들이 들어가 있다.
Retrofit2 인터페이스 부분인데 결론적으로 이부분의 @Field가 잘못의 원인이었다.
통신 코드이다.
고친것 : 인터페이스의 Field를 Body로 고치고 Body는 FormUrlEncoded를 사용하지 않으므로 지운다.
만약 Field로 할거면 다음과 같이해도 될 것 같다.(이건 실험안해봤습니다.)
@FromUrlEncoded
@POST("/route/createRoute")
Call<Routes> saveMyRoute(
@Field("routes") List<Route> routes;
);
이제 @Body와 @Field의 차이점을 알아보면 다음과 같다.
@Field
인자를 form-urlencoded 으로 보낼때 사용한다.
여기서 form-urlencoded는 key=value&key=value 와 같은 형태로 데이터를 전달하는 것을 말한다. ( 즉 키벨류 형식)
또한 레트로핏에서 @Field는 @FormUrlEncoded 와 함께 쓰인다.
다음은 예시다. 키 벨류 값이 들어갈 것으로 볼 수 있다.
P.S 만약 User의 멤버변수가 밑에처럼 6개를 가지고 있다면 saveUser를 Body형식으로 바꾸면
@Body User user로 바꿀수도 있을 것이다.
@Body
서버에서는 유일한 매개 변수로 받고, 클라이언트에서 Java Object를 통째로 직렬화 해서 보낼때 사용한다.
Java Object를 직렬화해서 보낼 수 있는것은, Retrofit이 Gson 컨버터와 함께 쓰이기 때문이다.
@Body RequestPut parameters : 통신을 통해 전송하는 값이 특정 JSON 형식일 때 그러한 형태를 매번 만들지 않고 객체를 통해서 넘겨주는 방식입니다. 이러한 방식에서는 @Body라는 Annotation을 사용합니다. (PUT뿐만 아니라 다른 통신 방식에서도 마찬가지로 사용가능합니다)
즉 내가 만든 객체를 Json형식으로 넘겨줄때 밑과같은 Json형식처럼 넘겨주고 싶을 때 간편하게 사용할 수 있다. (진짜 쉽게말하면 그냥 객체쉽게 json 형식으로 보낼때 사용한다고 생각하자)
이상 포스팅을 마치겠습니다.
감사합니다.!
출처 및 참고:
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] 카카오맵(kakao map) 에러 (4) | 2019.12.29 |
---|---|
[안드로이드] 서버 소켓 프로그래밍 (채팅) (0) | 2019.12.18 |
[안드로이드] 부스트코스 7단원 멀티미디어 내용요약 (0) | 2019.09.03 |
[안드로이드] Room 데이터베이스 (14) | 2019.08.25 |
[안드로이드] Parcelabe vs Serializable 성능차이 (0) | 2019.08.14 |