我的应用程序调用一个Web服务,它以字节为单位返回一个文件。该文件可以是pdf或JPG。我正在使用Retrofit。这就是我配置呼叫的方式:
public static final InterfazGibMobHttp getRetrofitClientUtf(Context c){
OkHttpClient client = new OkHttpClient();
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
settings = c.getSharedPreferences(c.getString(R.string.sharedPreferencesName), 0);
client.interceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Interceptor.Chain chain) throws IOException {
com.squareup.okhttp.Response respuesta2 = chain.proceed(chain.request());
String respuesta=respuesta2.body().string();//Weird characters here
//Some logging
}
com.squareup.okhttp.Response newResponse = respuesta2.newBuilder().body(ResponseBody.create(respuesta2.body().contentType(), respuesta.getBytes())).build();
return newResponse;
}
});
client.interceptors().add(logging);
String url=settings.getString("urlServlet", null);
Retrofit builder = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
final InterfazGibMobHttp interfaz = builder.create(MyInterface.class);
return interfaz;
}
当应用收到响应时,它应该获取字节,并使用以下代码创建一个文件:
Call<ResponseBody> peticion=RetrofitClient.getRetrofitClientUtf(ViewPagerActivity.this).obtenerFichero(settings.getString("imei", ""),settings.getString("idCliente", ""), object);
peticion.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
if(response.isSuccess()){
ResponseBody body=response.body();
File dir = new File(Environment.getExternalStorageDirectory() + “/nameOfApp/“+variable+"/"+anocherVariable);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, objetoFichero.get("nombre").getAsString());
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos=new FileOutputStream(file);
fos.write(body.bytes());
fos.flush();
fos.getFD().sync();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
anotherVariable+=1;
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
文件已创建,但是当我尝试打开文件时,文件未正确创建。它似乎被打破了。检查我得到的响应,在字符串“respuesta”中,我收到的一些字符显示为“?”黑色背景,所以可能是一个编码问题。我怎么能正确地得到我的文件......?在哪里玩编码?服务器用UTF-8发送它,在拦截器中我看到它是UTF-8的响应......我的错误在哪里?
谢谢。