AFNetworking 使用multipart/form-data方式傳數(shù)組

文章結構

1.http客戶端常用的請求方式

  1. multipart/form-data傳數(shù)組各個終端的實現(xiàn)方式以及后臺怎么處理拿到的數(shù)據(jù)

2.1 web端
2.2 安卓端(OKHTTP)
2.3 蘋果端(AFNetworking)
2.4 后臺處理拿到的數(shù)據(jù)

一、http請求常用的兩種方式post/get


HTTP請求方式有OPTIONS作郭、GET阿逃、HEAD斥黑、POST凌节、PUT施掏、DELETE谎倔、TRACE鸟辅、CONNECT

具體的http請求方式種類見這篇文章:
HTTP深入淺出 http請求
HTTP協(xié)議詳解

通常我們用的只有GET氛什、POST
常用的POST請求,按照content-Type來分匪凉,又分為 application/x-www-form-urlencoded枪眉、multipart/form-dataapplication/json這幾種再层。

具體的content-Type介紹可以看這篇文章:
理解HTTP之Content-Type

get 與post請求方式的區(qū)別就不細講了贸铜,這里我們看下HTTP1.1版本協(xié)議里面規(guī)定的一個標準的HTTP請求格式應該包含的內(nèi)容:

1.1 HTTP請求格式:

請求方法URI協(xié)議/版本
請求頭(Request Header)
請求正文

例子:

GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
 
username=jinqiao&password=1234

1.2 Content-Type幾個常見的類型

1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml

1.2.1 app常用的三種類型:

(1)application/x-www-form-urlencoded
application/x-www-form-urlencoded是常用的表單發(fā)包方式,普通的表單提交聂受,或者js發(fā)包蒿秦,默認都是通過這種方式, body以這樣的方式傳輸 name=homeway&key=nokey
如下:

WX20171214-155514@2x.png

(2)multipart/form-data

這里Content-Type告訴我們,發(fā)包是以multipart/form-data格式來傳輸蛋济,另外棍鳖,還有boundary用于分割數(shù)據(jù),具體的boundary由客戶端自定,在header中以boundary字段返回給服務端碗旅。
當文件太長鹊杖,HTTP無法在一個包之內(nèi)發(fā)送完畢,就需要分割數(shù)據(jù)扛芽,分割成一個一個chunk發(fā)送給服務端
那么--用于區(qū)分數(shù)據(jù)快,而后面的數(shù)據(jù)633e61ebf351484f9124d63ce76d8469就是標示區(qū)分包作用积瞒。

WX20171214-160125@2x.png

(3)application/json
在body中參數(shù)會以json字符串的形式川尖,傳送出去。如下所示。

image.png

二叮喳、multipart/form-data傳數(shù)組各個終端的實現(xiàn)方式以及后臺怎么處理拿到的數(shù)據(jù)


2.1 web端

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

以上代碼被芳,可以看出 HTML 傳遞數(shù)組 就是把參數(shù)寫成數(shù)組的形式,進行傳遞馍悟。
最終上傳的值會像這樣:
How to pass an array within a query string?

image.png

2.2 安卓端(OKHTTP)

這里是 截取的 postman使用數(shù)組參數(shù) 進行的請求頭的參數(shù)畔濒。
所以 我們只需要在代碼中找到 對應的API 就可以了。按照這個區(qū)拼接 HTTP的請求锣咒。
我這里 是使用的 okHTTP

private void addParams(MultipartBody.Builder builder) {
    if (params != null && !params.isEmpty()) {
        for (String key : params.keySet()) {
            builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + key.replaceAll("\\[\\d+\\]", "") + "\""),
                    RequestBody.create(null, params.get(key)));
        }
    }
}

然后就OK了
html這樣寫 有可能就是為了拼接這個才這樣寫的侵状。 在postman中嘗試,完美解決阿浓。傳遞過去 因為有 數(shù)組的標示[ ] 會把這個強轉(zhuǎn)成數(shù)組嫁艇。

2.3 蘋果端(AFNetworking)

上面有提到根據(jù)content-Type有以下三種常用的類型

1.application/x-www-form-urlencoded
2.multipart/form-data
3.application/json

我們再看下AFNetWorking

+ (void)postWithURL:(NSString *)url params:(NSDictionary *)params progress:(void (^)(id))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    mgr.requestSerializer.timeoutInterval = 20.0f;
    NSLog(@"url:%@\nparas:%@",url,params);
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    
    [mgr POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
        progress?progress(uploadProgress):nil;
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        success?success(responseObject):nil;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        failure?failure(error):nil;
        
    }];
}

官方給出來的三個請求類:


WX20171214-163523@2x.png

對應的content-Type類型如上致开,請求在不指定請求序列化類時默認用的第一種。第三種主要是對xml類型傳輸方式的支持艇潭,感興趣的朋友可以自己查閱下。

要切換請求content-Typeapplication/json方式很簡單戏蔑,直接上代碼蹋凝。

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    mgr.requestSerializer.timeoutInterval = 8.0f;
    NSString *token = [faceTokenMannage shareMannager].token;
    mgr.requestSerializer = [AFJSONRequestSerializer serializer];
    [mgr.requestSerializer setValue:token forHTTPHeaderField:@"Authorization"];

2.3.2 multipart/form-data

我們平時主要用來傳文件的函數(shù)

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                      progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

看下內(nèi)部的實現(xiàn)方式:



點擊跳轉(zhuǎn)



再跳轉(zhuǎn)

可以發(fā)現(xiàn)這里對數(shù)組的處理是類似的,[].
分別用afnet 以 multipart/form-data的方式傳純屬組总棵,以及字典數(shù)組鳍寂,抓包采集的結果如下:

純數(shù)組:

[name1,name2]
image.png

字典數(shù)組:

[{ID:peo1,name:ni},{ID:peo2,name:ni2}]

抓包結果


image.png

2.4 后臺處理拿到的數(shù)據(jù)

@RequestMapping("/uploadImage")
    public @ResponseBody FeedResult uploadImage(HttpServletRequest request, UploadFileForm form) {
        FeedResult f = new FeedResult();
//純數(shù)組
                String[]ids = request.getParameterValues("groups[]");
//數(shù)組對象
                String[]ids = request.getParameterValues("groups_id[]");
        String[]names = request.getParameterValues("groups_name[]");
        try {
            f = FileUploadUtil.handleUploadFile(form, true);
            return f;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return f.error("文件上傳失敗");
        }
    }

參考文獻:
四種常見的 POST 提交數(shù)據(jù)方式

android OKhttp 參數(shù) 傳遞數(shù)組類型

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彻舰,隨后出現(xiàn)的幾起案子伐割,更是在濱河造成了極大的恐慌,老刑警劉巖刃唤,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隔心,死亡現(xiàn)場離奇詭異,居然都是意外死亡尚胞,警方通過查閱死者的電腦和手機硬霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼裳,“玉大人唯卖,你說我怎么就攤上這事」恚” “怎么了拜轨?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長允青。 經(jīng)常有香客問我橄碾,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任法牲,我火速辦了婚禮史汗,結果婚禮上,老公的妹妹穿的比我還像新娘拒垃。我一直安慰自己停撞,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布悼瓮。 她就那樣靜靜地躺著戈毒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谤牡。 梳的紋絲不亂的頭發(fā)上副硅,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音翅萤,去河邊找鬼恐疲。 笑死,一個胖子當著我的面吹牛套么,可吹牛的內(nèi)容都是我干的培己。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胚泌,長吁一口氣:“原來是場噩夢啊……” “哼省咨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玷室,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤零蓉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后穷缤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敌蜂,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年津肛,在試婚紗的時候發(fā)現(xiàn)自己被綠了章喉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡身坐,死狀恐怖秸脱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情部蛇,我是刑警寧澤摊唇,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站涯鲁,受9級特大地震影響巷查,放射性物質(zhì)發(fā)生泄漏嘹害。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一吮便、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幢踏,春花似錦髓需、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搭幻,卻和暖如春咧擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檀蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工松申, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俯逾。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓贸桶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桌肴。 傳聞我的和親對象是個殘疾皇子皇筛,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容