1. 程式人生 > >Retrofit 2使用要點梳理:淺析POST檔案/表單上傳

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

實習期的第一個任務就是為專案組預研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!

相關推薦

Retrofit 2使用要點梳理淺析POST檔案/

實習期的第一個任務就是為專案組預研FACE++智慧人臉識別這一新功能。呼叫曠視FACE++人臉識別介面,進行人臉識別有兩種方式:一是通過先上傳圖片到雲端儲存網站(網盤,雲盤,七牛雲等)獲得圖片檔案對應的URL引數,通過圖片的網路URL引數呼叫FACE++介面;二是在手機客戶端直接上傳檔案呼叫FACE++介

PHPcurl模擬form檔案

<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="upload"> <buttion>submit</button> </f

PHP使用CURL向Python,Golang傳送檔案檔案[HTTP協議下Api]

PHP傳送方程式碼段: <?php /** * htppCurl表單上傳檔案 * @param $file FILE_ADDR * @param string $url uri * @param string $key key * @return bool|mixed *

圖片、檔案以及非同步

這次專案用到了圖片和檔案上傳到後臺,剛開始用的form表單,但是有一點不好的,就是點選上傳後會跳轉到action頁面,使用者體驗非常不舒服,所以就改為用ajax非同步上傳,現把我的心得上傳如下: 1、form表單 <form action="http://localh

Angular 2 + 折騰記 (7) 初步瞭解模板驅動及資料驅動及脫坑要點

前言 表單在整個系統中的作用相當重要,這裡主要扯下響應表單的實現方式。 首先需要操作表單的模組引入這兩個模組; import { FormsModule, ReactiveFormsModule } from '@angular/forms';

EXT.JS2.2檔案

var uploadFile = new Ext.form.TextField({ fieldLabel: '上傳檔案', id:'file', name: 'uploadFile', height

curl post檔案(C++)

最近測試如何上傳檔案到伺服器。原來傳照片一致通過binary 形式傳檔案,或者把圖片base64編碼傳圖片。一致沒有用form-data 表單形式傳送資料,今天嘗試下如何使用libcurl提供的API上傳檔案。 Sample code: #include <

Java Web 學習筆記之一伺服器獲取檔案

Servlet3.0標準之後,Java Web檔案上傳就不需要通過FileUpload等庫來實現了,通過servlet API即可實現web後臺的檔案上傳支援。 表單提交請求,表單中的檔案可以通過request.getPart()方法獲取。 下面來介紹獲取檔案的具體使用方

HttpClien實現使用post方式模擬檔案和字元引數

前提:自行準備好httpmime.jar /** * HttpClien實現模擬表單post提交檔案資料和字元引數,並支援大檔案上傳 * @author dance * */ public class HttpClientUploadManager { pub

IE相容筆記(一)相容IE9檔案

幾年前做相容IE8的pc端專案的時候就遇到檔案上傳的需求,當時也是檢視文件來解決IE9以下不支援formData的問題。由於之前沒有寫部落格的習慣,最近又遇到這樣的需求,所以寫出來想幫助需要用到的朋友。   本身檔案上傳不難,只需要注意一些細節: 用最初的表單提交的方式f

tp5的Request::instance()獲取post、get、引數、檔案

use think\Request;class Name{    $request = Request::instance();    $method = $request->method();//獲取上傳方式    $request->param();//獲取所

java模擬檔案,java通過模擬post方式提交實現圖片功能例項

package com.zdz.httpclient;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.

axios.post方式給後臺

先在main.js中引入axios自帶的querystring(不用安裝) import querystring from 'querystring' Vue.prototype.$qs = querystring 和原來寫的一樣。只是吧data變下。

form檔案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

ajax檔案 基於jquery form檔案

<script src="/static/js/jquery.js"></script><script> $("#reg-btn").click(function () { // 1. 取到使用者填寫的資料 var for

普通檔案和ajax檔案非同步

一.表單上傳: html客戶端部分: <form action="upload.ashx" method="post" enctype="multipart/form-data"> 選擇檔案:<input type="file" name="file1" /><br /

django 基於form檔案和基於ajax檔案

一、基於form表單上傳檔案 1、html裡是有一個input type="file" 和 ‘submit’的標籤 2、vies.py def fileupload(request): if request.method == 'POST': print(request.P

ajax實現檔案和form檔案的區別

在使用form表單的時候,一旦點選提交觸發submit事件,一般會使得頁面跳轉,頁面間的跳轉等行為的控制權往往在後端,後端會控制頁面的跳轉及資料傳遞,但是在某些時候不希望頁面跳轉,或者說想要將控制權放在前端,通過js來操作頁面的跳轉或者資料變化。 一般這種非同步的操作,我們

form檔案三要素

1.提供form表單,method必須是post 2.form表單的enctype必須是multipart/form-data 3.提供input type="file"類的上傳輸入域 <div> <form action="${ctx}/easyedu/sta

使用httpclient模擬檔案,後臺用struts2接收

本人是使用java,開發android後臺的,公司要求使用SSM框架,有一個功能要求是實現android大檔案的上傳。開發人員都是新手,以前沒有開發經驗,鼓搗了好久,也嘗試了兩個android框架,Xutils貌似跟struts2不太好整合,而AsyncHttpClient