2016-02-18 5 views
0

Je suis en train de mettre à jour le code qui a été créé à l'origine avec le client HTTP Apache pour utiliser Retrofit à la place. Le morceau de code que j'ai des problèmes avec télécharge une copie de la base de données d'application locale à mon serveur. Une partie de ce processus utilise le md5 de ce qui est envoyé dans l'authentification POST. Il crée d'abord l'entité multi-parties puis l'écrit dans un nouveau fichier afin que le md5 puisse être créé sur ce fichier.Comment écrire une entité Multi-parties dans un fichier lors de l'utilisation de Retrofit/OkHttp?

public class MyRestClient extends AsyncHttpClient { 

public void sendBackup(String secretKey, String accessId, AsyncHttpResponseHandler responseHandler){ 

    File file = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + FileUtil.DATABASE_FILE_NAME + ".db"); 
    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, boundary, Charset.forName("UTF-8")); 
    FileBody fileBody = new FileBody(file); 
    entity.addPart("device_backup[database_dump]", fileBody); 


    //creating this dummy file is crucial because for the server to authorize this file the 
    //server takes the md5 of the raw_post of the request and compares it to the md5 in the header 
    //this dummy file is mimicking the request.raw_post that is done on the server 
    File dummyFile = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + "dummy.db"); 
    try { 

     if (!dummyFile.exists()) { 
     dummyFile.createNewFile(); 
     } 

     FileOutputStream fileOutputStream = new FileOutputStream(dummyFile); 
     entity.writeTo(fileOutputStream); 

     fileOutputStream.flush(); 
     fileOutputStream.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    setAuth(DEVICE_BACKUP_EXTENSION, dummyFile, secretKey, accessId); 

    super.post(MyApplication.getContext(), DEVICE_BACKUP_URL, entity, MultipartContentType, responseHandler); 
    } 
} 

Ce que j'ai jusqu'à présent:

public void backupCurrentDatabase(final Long backupId) { 

    public static String boundary = "*****"; 
    public static final String MultipartContentType = "multipart/form-data;boundary=" + 
     boundary + "; charset=UTF-8"; 

    SharedPreferences prefs = getActivity().getSharedPreferences(Const.SHARE_PREF_NAME, Context.MODE_PRIVATE); 
    String accessId = prefs.getString(Const.ACCESS_ID_PREF_KEY, null); 
    String secretKey = prefs.getString(Const.SECRET_KEY_PREF_KEY, null); 
    File file = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + FileUtil.DATABASE_FILE_NAME + ".db"); 

    RequestBody requestBody = new MultipartBody.Builder() 
      .setType(MultipartBody.FORM) 
      .addFormDataPart("device_backup[database_dump]", FileUtil.DATABASE_FILE_NAME + ".db", 
        RequestBody.create(MediaType.parse(MultipartContentType), file)) 
      .build(); 

    File dummyFile = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + "dummy.db"); 
    try { 

     if (!dummyFile.exists()) { 
     dummyFile.createNewFile(); 
     } 

     FileOutputStream fileOutputStream = new FileOutputStream(dummyFile); 
     //Write requestBody to dummyFile 

     fileOutputStream.flush(); 
     fileOutputStream.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    SyncApi client = ServiceGenerator.createService(SyncApi.class, ServiceGenerator.DEVICE_BACKUP_EXTENSION, 
      dummyFile, secretKey, accessId); 
    Call<SendBackup> call = client.sendBackup(requestBody); 
    } 

Je prends donc les mêmes éléments d'information et faire une RequestBody qui peut être passé à travers Retrofit. Il semble que ce soit ce que j'écris dans le fichier dummy. Suivant est le même code pour écrire le Multipart à dummyFile, sauf qu'il manque la partie importante de l'écriture réelle dans le fileOutputStream parce que je ne sais pas quelle fonction utiliser. Ensuite, configurez l'instance Retrofit et transmettez toutes les informations d'authentification à mon générateur de service. Faites un appel et passez le requestBody à Retrofit. (call.enqueue() substance non montrée)

Qu'est-ce qui me manque pour faire ce travail? Un RequestBody est-il la bonne chose à utiliser?

Répondre

0
/** 
* Upload picture API method. 
* This upload picture feature is only for demo purpose. 
*/ 
public void UploadPictureToServer() 
{ 
    if (file != null) 
    { 
     final APIParameters parameters = new APIParameters(MainActivity.this,true,false); 
     Call<ResponseBody> call = parameters.GetUploadImageParameters(file); 
     if (call == null) 
     { 
      return; 
     } 
     call.enqueue(new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 

       parameters.DismissLoader(); 
       GetUploadImageData(response); 
      } 

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

       parameters.DismissLoader(); 
       t.printStackTrace(); 
      } 
     }); 
    } 
} 

/** 
* Get Upload image response for parsing data 
* @param response 
*/ 
private void GetUploadImageData(Response<ResponseBody> response) 
{ 
    String MyResult = null; 
    try 
    { 
     MyResult = CM.GetAPIResponseStatus(response.body().string(),MainActivity.this); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    if (MyResult == null) 
    { 
     return; 
    } 

    ArrayList<Model_Category> model_categoryArrayList = JSONHelper.parseUploadImageResponse(MyResult); 
    if (model_categoryArrayList != null) 
    { 
    /* try 
     { 
      CacheMemory.writeObject(MainActivity.this, "category.txt", model_categoryArrayList); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     }*/ 
     for (int i=0;i<model_categoryArrayList.size();i++) 
     { 
      Log.e("Category :-->","Id : "+model_categoryArrayList.get(i).id+" Name : "+model_categoryArrayList.get(i).categoryName); 
     } 
    } 
} 

API Interface

/** 
* If you do not need any type-specific response, you can specify return value as simply Call<ResponseBody>. 
* @param image 
* @param //name 
* @return 
*/ 
@Multipart 
@POST(URLS.WEB_ADD_CATEGORY) 
Call<ResponseBody> postImage(@Query(WebServicesTags.TAG_STR_APIKEY) String apiKey,@Part MultipartBody.Part image,@Part("userId") RequestBody userId,@Part("categoryName") RequestBody categoryName,@Part("deviceType") RequestBody deviceType,@Part("deviceToken") RequestBody deviceToken,@Part("accessToken") RequestBody accessToken,@Part("intUdId") RequestBody intUdId);