Изображение дооснащения загружено, но возвращается пустой ответ сервера - PullRequest
2 голосов
/ 14 января 2020

Я не могу получить ответ, используя модификацию, хотя он дает успешный ответ как:

Response{protocol=http/1.1, code=201, message=Created, url=http://test.some_url.in/api/upload/user/PostUserImage/}

, и изображение успешно загружено на сервер, но в теле ответа или при использовании ничего не отображается Gson:

Я использую следующий код:

private void uploadImage(byte[] imageBytes) {

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);

RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), imageBytes);

MultipartBody.Part body = MultipartBody.Part.createFormData("image", "unnamed.jpg", requestFile);
Call<Response> call = retrofitInterface.uploadImage(body);
mProgressBar.setVisibility(View.VISIBLE);
call.enqueue(new Callback<Response>() {
    @Override
    public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {

        mProgressBar.setVisibility(View.GONE);

        Log.v("keys","-----response---------"+response);
        if (response.isSuccessful()) {

            Response responseBody = response.body();
            mBtImageShow.setVisibility(View.VISIBLE);
            assert responseBody != null;

        } else {

            ResponseBody errorBody = response.errorBody();

            Gson gson = new Gson();

            assert errorBody != null;
            Response errorResponse = gson.fromJson(errorBody.toString(), Response.class);


        }
    }

    @Override
    public void onFailure(Call<Response> call, Throwable t) {

        mProgressBar.setVisibility(View.GONE);
        Log.d(TAG, "onFailure: "+t.getLocalizedMessage());
    }
});
}

Скажите, пожалуйста, как я могу получить ответ от сервера .....

Ответы [ 2 ]

1 голос
/ 14 января 2020

Для получения правильного необработанного ответа ( Ошибка или Успех ) от сервера используйте ResponseBody в качестве обобщенного c класса Response

Таким образом, вы можете обновить свой код, например:

 Call<ResponseBody> call = retrofitInterface.uploadImage(body);
    mProgressBar.setVisibility(View.VISIBLE);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {

            mProgressBar.setVisibility(View.GONE);

           // Log.v("keys","-----response---------"+response);
            if (response.isSuccessful()) {

               // Response responseBody = response.body();
                //mBtImageShow.setVisibility(View.VISIBLE);
                //assert responseBody != null;

                 try{
                Log.d("response","data: "+response.body().string())
              }catch(Exception e){
                e.printStackTrace();
                  }

            } else {

               // ResponseBody errorBody = response.errorBody();

                //Gson gson = new Gson();

                //assert errorBody != null;
                //Response errorResponse = gson.fromJson(errorBody.toString(), Response.class);


            try{
               Log.e("response","error: "+response.errorBody().string())
              }catch(Exception e){
               e.printStackTrace();
               }
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

            mProgressBar.setVisibility(View.GONE);
            Log.d(TAG, "onFailure: "+t.getMessage());
        }
    });

Надеюсь, вы получите правильный ответ

0 голосов
/ 14 января 2020

Вы можете использовать HttpLoggingInterceptor для печати всего запроса и ответа в logcat

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY))
                    .connectTimeout(2, TimeUnit.MINUTES)
                    .writeTimeout(2, TimeUnit.MINUTES)
                    .readTimeout(2, TimeUnit.MINUTES)
                    .build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build();

для регистрации-перехватчика

implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

В RequestBody вы передать File вместо байтового массива

RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), imageBytes);
...