實習期的第一個任務就是爲項目組預研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_ATTRIBUTE
api
其中: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個請求參數,具體代碼以下: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