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


本博客為作者原創,如需轉載請注明處處:http://www.cnblogs.com/wondertwo/p/6143188.html


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

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_ATTRIBUTE

其中: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個請求參數,具體代碼如下:

// 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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM