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?