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 $

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"
    }
    
    • 익셉션 메시지만 올려주셨는데, 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가 떨어집니다 하지만 값들이 제대로 안넘어간건지 값이 비어있습니다.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.