Retrofit1.9 질문드립니다.


질문 1

이미지 파일 업로드

https://futurestud.io/blog/retrofit-how-to-upload-files

이 링크를 따라하였습니다.

결과적으로 서버에 파일이 정상적으로 업로드가 되었습니다.

하지만 로그는 failure 로 떨어지고 있습니다.

구글링으로 이슈를 찾아보았으니 해결하지 못했습니다 ㅠㅠ

인터페이스 수정부분

    @Multipart
    @POST("/SellBook/uploadFile.php")
    void upload(@Part("myfile") TypedFile file,
                @Part("file_rename") String file_rename,
                Callback<String> cb);

파일 업로드

private void uploadFile(File file, String file_rename) {
    Retrofit_api service = ServiceGenerator.createService(Retrofit_api.class);
    TypedFile typedFile = new TypedFile("multipart/form-data", file);

    service.upload(typedFile,file_rename, new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            Log.e("Upload", "success");
        }
        @Override
        public void failure(RetrofitError error) {
            Log.e("Upload", error.getMessage());
        }
    });
}

에러로그

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 6 path $

  • 2016년 06월 10일에 작성됨

조회수 685


4 답변


좋아요
1
싫어요
채택취소하기

올려주신 에러 로그로는 Resnpose가 JSON 규격에 맞지 않아서 발생하는 것 같습니다. 파일 업로드 후 서버 Response를 확인해보는게 좋을 것 같습니다. RestAdapter.Builder 생성 시 다음과 같이 로그 레벨을 LogLevel.FULL로 설정하면 모든 네트워크 로그를 볼 수 있습니다.

RestAdapter.Builder builder = new RestAdapter.Builder()  
    .setEndpoint(API_LOCATION)
    .setLogLevel(RestAdapter.LogLevel.FULL) 
    .setClient(new OkClient(new OkHttpClient()));

파일 업로드 후 내려오는 Response 로그를 복사해서 아래 웹사이트에 붙여넣기 해보세요. 해당 포맷이 JSON 규격에 맞는지 확인할 수 있습니다.


  • php에서 json_encode를 이용해 echo 찍어주니 sucess로 떨어집니다.    김재우   2016.6.11 00:59     
  • 한가지만 더 질문드리겠습니다    김재우   2016.6.11 01:05     

로그 상으로는 Response body가 존재하지 않는데 작성하신 Retrofit 인터페이스는 Response body로 BoardCreate를 받도록 정의되어 있어서 발생하는 현상인 것 같습니다.

@POST("/SellBook/register_book.php")
void create_board(@Body BoardCreate boardCreate, Callback<BoardCreate> bd);

서버에서 Response body를 내려주거나 클라이언트 코드를 다음과 같이 수정해 보시기 바랍니다. (success 함수의 파라미터도 Void 타입으로 변경하세요.)

@POST("/SellBook/register_book.php")
void create_board(@Body BoardCreate boardCreate, Callback<Void> response);

  • 서버에서 body가 존재하지 않아서 말씀해주신데로 수정했습니다. 그치만 오류는 남아있네요ㅠㅠ 답변 정말 감사합니다!!    김재우   2016.6.11 19:22     
  • 서버단에서 reponse부분을 없애버리니 제대로 떨어집니다 감사합니다    김재우   2016.6.11 19:35     

링크 : https://futurestud.io/blog/retrofit-send-objects-in-request-body 데이터를 body에 담아 보내고 있습니다. 로그를 찍어서 나오는 데이터를 알려주신 싸이트에서 보면 JSON 규격에 맞는거 같은데 에러는 JSON 규격 문제인거같습니다.

@POST("/SellBook/register_book.php")
void create_board(@Body BoardCreate boardCreate, Callback<BoardCreate> bd);
Retrofit_api service = ServiceGenerator.createService(Retrofit_api.class);
BoardCreate boardCreate = new BoardCreate(user_id,data_group,data_price,data_board,data_phone,data_image1,data_image2,data_image3);

        service.create_board(boardCreate, new Callback<BoardCreate>() {

            @Override
            public void success(BoardCreate boardCreate, Response response) {
                Log.d("TAG","success");
            }

            @Override
            public void failure(RetrofitError error) {
                Log.e("TAG",error.getMessage());
            }
        });

에러내용

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 2 path $

로그에 찍힌 json값

{"book_category":"사회과학대학","book_content":"ㄴㄱㄴㄱㄷㄱ","book_image1":"","book_image2":"","book_image3":"","book_phone":"12312341235","book_price":"145","user_id":"21135270"}

==>

{  
   "book_category":"사회과학대학",
   "book_content":"그극",
   "book_image1":"21135270_1465574585737_Screenshot_2016-06-06-12-23-28.png",
   "book_image2":"",
   "book_image3":"",
   "book_phone":"12341234123",
   "book_price":"234",
   "user_id":"21135270"
}
  • 2016년 06월 11일에 작성됨

  • 익셉션 메시지만 올려주셨는데, Request부터 Respnose까지 전체 로그를 올려주시면 파악하는데 도움이 될 것 같습니다.     한로니로니   2016.6.11 08:10     
  • 아 정보가 부족했네요 지금 바로 올리겠습니다    김재우   2016.6.11 10:48     

--> HTTP POST http://요청주소/register_book.php
D/Retrofit: Content-Type: application/json; charset=UTF-8
D/Retrofit: Content-Length: 184
D/Retrofit: {"book_category":"사회과학대학","book_content":"테스트","book_image1":"","book_image2":"","book_image3":"","book_phone":"00000000000","book_price":"5000","user_id":"21135270"}
D/Retrofit: ---> END HTTP (184-byte body)
D/Retrofit: <--- HTTP 200 http://요청주소/register_book.php (412ms)
D/Retrofit: Server: nginx
D/Retrofit: Date: Sat, 11 Jun 2016 01:49:55 GMT
D/Retrofit: Content-Type: text/html
D/Retrofit: Transfer-Encoding: chunked
D/Retrofit: Connection: keep-alive
D/Retrofit: Vary: Accept-Encoding
D/Retrofit: P3P: CP='NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE'
D/Retrofit: OkHttp-Sent-Millis: 1465609796321
D/Retrofit: OkHttp-Received-Millis: 1465609796670
D/Retrofit: "success"  
D/Retrofit: <--- END HTTP (14-byte body)
-----------------------------------------------------------------------------------------
E/TAG: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 2 path $

현재 이렇게하면 DB에서는 쿼리를 실행해서 success가 떨어집니다 하지만 값들이 제대로 안넘어간건지 값이 비어있습니다.

  • 2016년 06월 11일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close