2017-02-07 18 views
0

Я использую «Дооснащение» для загрузки файлов на сервер. Он работает правильно иногда, но иногда (и нередко) он дает мне ответ 400 (Плохой запрос) на тот же запрос. Это известная проблема или что может быть проблемой?Android Retrofit 2: Случайный код 400 (неверный запрос)

Это весь код для загрузки:

public static void uploadFile(String authString, 
           Uri fileUri, 
           Context context, 
           MVPCallback<ResponseBody> mvpCallback) { 
    FileUploadService service = 
      ServiceGenerator.createService(FileUploadService.class, authString); 
    String filePath = FacadeMedia.getPath(context, fileUri); 
    if (filePath != null) { 
     File uploadFile = new File(filePath); 
     RequestBody requestFile = RequestBody.create(
         MediaType.parse(context.getContentResolver().getType(fileUri)), 
         uploadFile); 
     MultipartBody.Part body = 
       MultipartBody.Part.createFormData("file", uploadFile.getName(), requestFile); 
     String content_disposition = "file; filename=\"" + uploadFile.getName() + "\""; 
     Call<ResponseBody> call = service.upload(body, content_disposition); 
     call.enqueue(new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, 
            Response<ResponseBody> response) { 
       if(response.isSuccessful()){ 
        mvpCallback.onSuccess(response.body()); 
       }else { 
        mvpCallback.onError(new Throwable(response.errorBody().toString())); 
       } 

      } 

      @Override 
      public void onFailure(Call<ResponseBody> call, Throwable t) { 
       mvpCallback.onError(t); 
      } 
     }); 
    } 
} 


public interface FileUploadService { 

@Multipart 
@POST(HttpFactory.UPLOAD_FILE_URL) 
Call<ResponseBody> upload(
     @Part MultipartBody.Part file, 
     @Header("Content-Disposition") String content_disposition 
); 
} 


public class ServiceGenerator { 

private static Retrofit retrofit; 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()); 

private static OkHttpClient.Builder httpClient = 
     new OkHttpClient.Builder(); 

public static <S> S createService(Class<S> serviceClass, String authString)  { 
    httpClient.addInterceptor(chain -> { 
     Request request = chain.request() 
       .newBuilder() 
       .addHeader("Authorization", " Basic "+authString).build(); 
     return chain.proceed(request); 
    }); 
    retrofit = builder.client(httpClient.build()).build(); 
    return retrofit.create(serviceClass); 
} 

}

EDIT:

Это сообщение errorBody:

E/Bad request:: <html> 
      <head><title>400 Bad Request</title></head> 
      <body bgcolor="white"> 
      <center><h1>400 Bad Request</h1></center> 
      <hr><center>cloudflare-nginx</center> 
      </body> 
      </html> 
+1

есть ли у вас проверка в случае возникновения ошибки? – dipali

+0

Нет правила. Это просто происходит. Иногда он начинает работать после 4-5 последовательных попыток, иногда я должен перезапустить приложение, и он все равно не будет работать, иногда это будет. – Sermilion

+0

Получается ли это получение ответа от sucess в любом случае? – dipali

ответ

1

Так я это исправил мой переинициализация OkHttpClient каждый ew запрос. Вероятно, в нем есть несколько старых данных. Если кто-то может это понять, было бы здорово.

+0

попробуйте это правило в своем заголовке: «Cache-Control: no-cache» –

 Смежные вопросы

  • Нет связанных вопросов^_^