【问题标题】:Retrofit image is uploaded but empty server response is returned上传改造图像但返回空服务器响应
【发布时间】:2020-04-30 19:20:13
【问题描述】:

我无法使用改造获得响应,但它给出了成功响应:

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());
    }
});
}

请告诉我如何获得服务器响应.....

【问题讨论】:

  • 你的api返回响应了吗?
  • 是的,当我在 ARC 客户端执行操作时,它会返回,它会在 JSON 数组中返回 [图像上传成功],但是当使用改造代码时,图像会被上传,但响应只有 Response{protocol=http /1.1,代码=201,消息=创建,url=test.some_url.in/api/upload/user/PostUserImage}
  • HTTP 201 Created 成功状态响应码表示请求已成功并导致创建资源,所以将 201 作为成功响应。 - restfulapi.net/http-status-201-created
  • 将您的回复更新为public void onResponse(Call&lt;Response&gt; call, retrofit2.Response&lt;Response&gt; response)public void onResponse(Call&lt;ResponseBody&gt; call, retrofit2.Response&lt;ResponseBody&gt; response) 以及相关区域
  • 更改您的回复类型,如上评论。响应响应体

标签: android web-services gson retrofit retrofit2


【解决方案1】:

为了从服务器获取正确的原始响应(错误成功),请使用ResponseBody作为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());
        }
    });

希望你能得到正确的答复

【讨论】:

  • 感谢@Tariqul Islam,它真的很有魅力。
  • 欢迎。我评论了你的代码。您可以根据您的响应更改它执行您想要的操作。
【解决方案2】:

您可以使用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);

【讨论】:

  • 感谢您的回复。先生,您能解释一下我如何使用这个 okHttpClient 对象来打印整个请求。
  • 所有活动都发生在网络请求或响应中,它以详细模式在 logcat 中完成打印
  • 对不起,先生,我已经按照建议使用了 HttpLoggingInterceptor 和 OkHttpClient,但仍然没有显示任何响应。
  • 在 RequestBody 中传递 File 而不是 Byte Array
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2019-06-20
  • 2018-10-05
  • 2017-05-21
  • 2018-04-03
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多