本博客為作者原創,如需轉載請注明處處: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_key
與api_secret
字段分別表示你在官網創建應用時創建的對應api_key
和api_secret
,img_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!