Retrofit 2使用要點梳理:淺析POST文件/表單上傳

本博客爲做者原創,如需轉載請註明到處:http://www.cnblogs.com/wondertwo/p/6143188.html


實習期的第一個任務就是爲項目組預研FACE++智能人臉識別這一新功能。調用曠視FACE++人臉識別接口,進行人臉識別有兩種方式:一是經過先上傳圖片到雲存儲網站(網盤,雲盤,七牛雲等)得到圖片文件對應的URL參數,經過圖片的網絡URL參數調用FACE++接口;二是在手機客戶端直接上傳文件調用FACE++接口。第二種方式須要經過POST 請求方式上傳圖片文件的二進制數據,而咱們選擇用Retrofit 2來實現這一功能。接下來主要分析第二種狀況。請求URL接口調用示例以下:html

https://api-cn.faceplusplus.com/facepp/v3/detect/detection?api_key=YOUR_API_KEY&api_secret=YOUR_API_SECRET&img_file=YOUR_IMAGE_FILE&return_attributes=YOUR_ATTRIBUTEapi

其中:api_keyapi_secret字段分別表示你在官網建立應用時建立的對應api_keyapi_secretimg_file 字段表示要上傳的圖片文件的二進制數據,須要用post multipart/form-data 方式上傳;return_attributes 字段表示須要獲取的人臉屬性,咱們這裏獲取人臉對應的性別和年齡數據便可。服務器

Retrofit 2定義網絡請求是經過註解的方式,因此天然咱們這裏就用到了@POST 註解來提交咱們的圖片文件的二進制數據,須要注意用@Part MultipartBody.Part 註解來定義咱們要上傳的圖片文件,用@Part("attribute") RequestBody 直接來定義請求中的字符串字段,代碼具體以下:網絡

public interface DetectService {
    @Multipart //請求體有多部分,使用@MultiPart上傳
    @POST("detection/detect") //URL,能夠爲空
    Call<PhotoBean> detect(
            @Part("api_key") RequestBody request_api_key,
            @Part("api_secret") RequestBody request_api_secret,
            @Part MultipartBody.Part request_img_part,
            @Part("attribute") RequestBody request_attribute
            );
}

接下來,咱們須要在MainActivity 中調用DetectService 接口定義的detect() 方法發起網絡請求,在發起網絡請求是,咱們須要先建立一下接口方法中定義的4個請求參數,具體代碼以下:ide

// YOUR_API_KEY,YOUR_API_SECRET,YOUR_ATTRIBUTE
String apiKey = "YOUR_API_KEY";
Stirng apiSecret = "YOUR_API_SECRET";
Stirng attribute = "YOUR_ATTRIBUTE";

// 建立RequestBody,傳入參數:"multipart/form-data",String
RequestBody requestApiKey = RequestBody.create(MediaType.parse("multipart/form-data"), apiKey);
RequestBody requestApiSecret = RequestBody.create(MediaType.parse("multipart/form-data"), apiSecret);
RequestBody requestApiAttribute = RequestBody.create(MediaType.parse("multipart/form-data"), attribute);

// 建立RequestBody,傳入參數:"multipart/form-data",File
RequestBody requestImgFile = RequestBody.create(MediaType.parse("multipart/form-data"), imgFile);
// 建立MultipartBody.Part,用於封裝文件數據
MultipartBody.Part requestImgPart = 
        MultipartBody.Part.createFormData("img_file", imgFile.getName(), requestImgFile);

// 發起網絡請求,上傳圖片我二進制數據
DetectService service = new DetectService();
Call<ResponseBody> call = service.detect(requestApiKey, requestApiSecret, requestImgPart, requestApiAttribute);
call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            // 網絡請求成功,處理響應結果
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            // 網絡請求失敗,錯誤處理
        }
    });

至此,經過Retrofit 2 @POST 註解上傳文件二進制數據到服務器就完成啦,OK!post

相關文章
相關標籤/搜索