A-APT/DuckBox-Android

안드로이드 Retrofit 데이터 타입 문제

Closed this issue · 3 comments

  • 이미지 API 반환 값 처리
  • String 전송 문제
  • Date() 타입 문제

다음의 3가지 Retrofit 데이터 타입 이슈가 발생했습니다.

이미지 API 반환 값 처리

Failed GetAllGroup API call with call: retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall@86733cd + exception: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 177 path $[0].profile

서버에서는 이미지를 BytesArray로 반환하지만, json을 사용할 경우 Bytes를 나타낼 방법이 없기 때문에 String으로 변환되어 전송이 됩니다. 따라서 안드로이드에서 Retrofit을 사용하여 BytesArray를 받을 경울 String을 BytesArray로 변경하는 과정이 필요합니다.

따라서 안드로이드에서 서버로 BytesArray를 전송할 때는 Bitmap을 ByteArrayOutputStream으로 변경하고 이를 toByteArray()으로 ByteArray로 변경하여 전송해야합니다.

또한 서버에서 안드로이드로 BytesArray를 받을 때는 이미지 배열을 String으로 받고, 이를 Base64.decode()와 BitmapFactory.decodeByteArray으로 Bitmap을 얻어 사용합니다.

byte[] decodedImageBytes = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedImageBytes, 0, decodedImageBytes.length);

참고 자료

관련 Pull Request

String 전송 문제

안드로이드에서 서버로 이메일을 전송할 때 텍스트에 따옴표(””)가 자동으로 함께 저장되어 데이터 구조에 오류가 발생했습니다. 기본 설정이 json으로 되어 있어서 전송 시 “”를 제거하는 text plain으로 변경해야 합니다. 따라서 RequestBody 클래스를 사용하여 String 타입을 text/plain으로 변경하여 사용했습니다.

`String text = "plain text request body";
RequestBody body =
RequestBody.create(MediaType.parse("text/plain"), text);

Call call = service.getStringRequestBody(body);
Response response = call.execute();
String value = response.body().string();`

참고 자료

Date() 타입 문제

image

안드로이드에서 서버로 Date 타입의 데이터를 전송할 때, 서버에서 deserialize 가능한 포맷으로 변환되지 않아 이를 커스텀 해주었습니다. 따라서 서버로 전송될 때, GsonBuilder로 Date 타입을 "yyyy-MM-dd'T'HH:mm:ss.SSSX" 로 지정해주었습니다.

var gson = GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") .setLenient() .create()