[iOS]http的表單請求

現(xiàn)在我們經(jīng)常用到請求數(shù)據(jù)的方式是http+json方式四濒,但是歼捐,在某些情況下,后臺提供給你的方式是http的表單請求方式率触,今天就總結(jié)一下表單請求方式的實現(xiàn)。
先來看一下表單的一般形式:

3491AF42-5C81-448B-B7BB-5C776C551507.png

在表單中汇竭,我們需要注意的有以下幾點:

  • 1.我們需要自己設(shè)置Content-Type和Content-Length
  • 2.在表單中葱蝗,boundary是一個很重要的東西,他可以是一個隨機的字符串细燎,它是將參數(shù)隔開的標(biāo)志两曼,但需要注意的是,這個標(biāo)志在整個表單中必須一致
  • 3.我們在設(shè)置參數(shù)時玻驻,需要指定Content-Disposition合愈,其中,name為參數(shù)對于的key值击狮。如果參數(shù)為文件格式,同時還要指定filename以及Content-Type
  • 4.其中最重要的一點益老,就是在設(shè)置參數(shù)的value時彪蓬,必須在值之前加入一個換行。同時捺萌,在http中档冬,換行為\r\n
  • 5.參數(shù)的分隔是以"--"拼接上boundary,然后拼接上"\r\n"來實現(xiàn)的桃纯,同時酷誓,在所有參數(shù)結(jié)束后,需要以"--"拼接boundary再拼接"--"來結(jié)束态坦。

接下來寫一個簡短的例子來記錄用法盐数,在這個例子中,接口需要傳入兩個參數(shù)伞梯,一個為簡單的參數(shù)玫氢,另一個為文件參數(shù)。

  • 1.我們可以自己拼接出表單形式
    //接口地址
    NSString *path = kURL;
    //boundary
    NSString *theBoundary = @"myBoundary";
    //訪問請求
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:path]];
    request.HTTPMethod = @"POST";
    //用來拼接參數(shù)
    NSMutableData *data = [NSMutableData data];
    //拼接第一個參數(shù)
    [data appendData:[[NSString stringWithFormat:@"--%@\r\n", theBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接參數(shù)名
    [data appendData:[@"Content-Disposition:form-data;name=\"uid\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接參數(shù)值
    [data appendData:[@"11230953" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接第二個參數(shù)
    [data appendData:[[NSString stringWithFormat:@"--%@\r\n", theBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接參數(shù)名
    [data appendData:[@"Content-Disposition:form-data;name=\"file\";filename=\"myText.txt\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接文件類型
    [data appendData:[@"Content-Type:text/plain" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:[@"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接參數(shù)值
    [data appendData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myText" ofType:@"txt"]]];
    [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //拼接結(jié)束標(biāo)志
    [data appendData:[[NSString stringWithFormat:@"--%@--", theBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    request.HTTPBody = data;
    [request setValue:[NSString stringWithFormat:@"multipart/form-data;boundary=%@", theBoundary] forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%ld", data.length] forHTTPHeaderField:@"Content-Length"];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"%@", dic);
    }];
    [dataTask resume];
  • 2.既然是網(wǎng)絡(luò)請求谜诫,就不能忘掉強大的AFN漾峡,AFN提供了表單的請求方法,下圖是AFN主頁所講:
C3875D2B-96D8-4BD3-8766-BBF0CB665228.png

我們可以用AFN來實現(xiàn)上述接口的傳參:

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:kURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFormData:[@"11230953" dataUsingEncoding:NSUTF8StringEncoding] name:@"uid"];
        [formData appendPartWithFileData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myText" ofType:@"txt"]] name:@"file" fileName:@"myText.txt" mimeType:@"text/plain"];
    } error:nil];
    
    
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    
    NSURLSessionUploadTask *uploadTask;
    uploadTask = [manager
                  uploadTaskWithStreamedRequest:request
                  progress:^(NSProgress * _Nonnull uploadProgress) {
                  }
                  completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                      if (error) {
                          NSLog(@"Error: %@", error);
                      } else {
                          NSLog(@"%@ %@", response, responseObject);
                      }
                  }];
    
    [uploadTask resume];

注意喻旷,有時可能會報以下錯誤:

B21632C2-15F0-4AF7-A480-38154DB5B320.png

這里我們可以去工程中查找AFN的源碼生逸,其中有一個文件為:AFURLResponseSerialization.m,我們在第220行左右做一些修改,將所缺少類型加上即可:
修改前:

    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

修改后:

    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槽袄,一起剝皮案震驚了整個濱河市烙无,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掰伸,老刑警劉巖皱炉,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狮鸭,居然都是意外死亡合搅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門歧蕉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾部,“玉大人,你說我怎么就攤上這事惯退《乃瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵催跪,是天一觀的道長锁蠕。 經(jīng)常有香客問我,道長懊蒸,這世上最難降的妖魔是什么荣倾? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮骑丸,結(jié)果婚禮上舌仍,老公的妹妹穿的比我還像新娘。我一直安慰自己通危,他們只是感情好铸豁,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菊碟,像睡著了一般节芥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上框沟,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天藏古,我揣著相機與錄音,去河邊找鬼忍燥。 笑死拧晕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梅垄。 我是一名探鬼主播厂捞,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼输玷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了靡馁?” 一聲冷哼從身側(cè)響起欲鹏,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臭墨,沒想到半個月后赔嚎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡胧弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年尤误,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片结缚。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡损晤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出红竭,到底是詐尸還是另有隱情尤勋,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布茵宪,位于F島的核電站最冰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稀火。R本人自食惡果不足惜锌奴,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憾股。 院中可真熱鬧,春花似錦箕慧、人聲如沸服球。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斩熊。三九已至,卻和暖如春伐庭,著一層夾襖步出監(jiān)牢的瞬間粉渠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工圾另, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霸株,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓集乔,卻偏偏與公主長得像去件,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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