上传改造图像但返回空服务器响应
Posted
技术标签:
【中文标题】上传改造图像但返回空服务器响应【英文标题】:Retrofit image is uploaded but empty server response is returned 【发布时间】:2020-04-30 19:20:13 【问题描述】:我无法使用改造获得响应,但它给出了成功响应:
Responseprotocol=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 数组中返回 [图像上传成功],但是当使用改造代码时,图像会被上传,但响应只有 Responseprotocol=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<Response> call, retrofit2.Response<Response> response)
到public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response)
以及相关区域
更改您的回复类型,如上评论。响应响应体
【参考方案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以上是关于上传改造图像但返回空服务器响应的主要内容,如果未能解决你的问题,请参考以下文章
改造 2:responseBodyConverter 转换为空对象