实习期的第一个任务就是为项目组预研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