記錄一下今天下午爬了一下午的坑吧~
前幾天新開一個新的app,界面的搭建的七七八八了经窖,接口也出了一部分坡垫,今天加班就準備調(diào)一下接口試試水,然后就是一下午的爬坑過程画侣。
首先冰悠,調(diào)用后臺的登陸接口,很順利配乱,后臺斷點攔截到了我的請求溉卓,我天真的以為接口就這么ok了,可是發(fā)現(xiàn)后臺給我在數(shù)據(jù)庫里面添加的賬號登陸不成功搬泥。叫后臺的小伙伴幫忙看看桑寨,后臺攔截我的請求發(fā)現(xiàn),我傳給他的參數(shù)他取不到值忿檩。
好了尉尾,問題來了,我正常的使用post請求燥透,請求也過去了沙咏,他為啥就是拿不到我的參數(shù)呢辨图?
剛開始的時候以為是后臺寫的有問題,他們改了幾次芭碍,發(fā)現(xiàn)還是取不到我傳過去的參數(shù)徒役,然后安卓的小伙子也過來了,說他們也試試窖壕,結(jié)果就是他們很順利的調(diào)成功了忧勿,后臺也是一把就拿到他們傳過去的參數(shù)。
沒辦法了瞻讽,問題應(yīng)該就是在我們iOS這邊了鸳吸,一步步的走請求的流程也沒看出什么不一樣的啊。速勇。晌砾。。烦磁。我也不能改AFN的內(nèi)部代碼吧
試了幾次發(fā)現(xiàn)問題并沒有解決养匈,然后就灰溜溜的拿上一個項目的網(wǎng)絡(luò)請求試了一下,結(jié)果還是一樣都伪,他們是真的拿不到我傳過去的參數(shù)呕乎。我用postMan調(diào)用接口的時候,他們是可以拿到參數(shù)的陨晶。問了一下猬仁,后臺說參數(shù)是放在body里面的,我趕緊問了一下跟我一起開發(fā)的iOS同伙先誉,他說參數(shù)不是放在body里面的湿刽,我就照著上個項目里面的把請求方法改了,把參數(shù)放body里面去了褐耳,然后試了一把诈闺,心里默默祈禱能夠成功,結(jié)果并沒有什么用铃芦。心里真的是賊急躁买雾,今天怕是不搞定回不去了。
找不到問題在哪杨帽,找不到問題在哪漓穿,找不到問題在哪。
默默的拿出很久以前的項目又重新試了一次注盈,還是調(diào)這個借口晃危,一問后臺,小伙伴說有數(shù)據(jù)了,沒錯有數(shù)據(jù)了僚饭,可把我給高興壞了震叮。慢慢的就對照著請求方法一行一行的看,沒看出問題鳍鸵,兩邊寫的都一樣的啊苇瓣。打開sharedClient一看,發(fā)現(xiàn)不一樣的了
我們app這么寫的
+ (instancetype)sharedClient {
static NetWorkClient *sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURL *baseUrl = [NSURL URLWithString:[NetWorkConfig sharedConfig].baseUrl];
//解決AFN中relativeToURL:self.baseURL方法去掉尾部字符串問題,實際作用是給baseUrl后面拼一個'/'
baseUrl = [baseUrl URLByAppendingPathComponent:@""];
sharedClient = [[NetWorkClient alloc] initWithBaseURL:baseUrl];
sharedClient.responseSerializer = [AFJSONResponseSerializer serializer];
sharedClient.requestSerializer = [AFJSONRequestSerializer serializer];
[sharedClient.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[sharedClient.requestSerializer setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
});
return sharedClient;
}
以前app是這么寫的
+ (instancetype)sharedClient {
static NetWorkClient *sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURL *baseUrl = [NSURL URLWithString:[NetWorkConfig sharedConfig].baseUrl];
//解決AFN中relativeToURL:self.baseURL方法去掉尾部字符串問題,實際作用是給baseUrl后面拼一個'/'
baseUrl = [baseUrl URLByAppendingPathComponent:@""];
sharedClient = [[NetWorkClient alloc] initWithBaseURL:baseUrl];
((AFJSONResponseSerializer *)sharedClient.responseSerializer).removesKeysWithNullValues = YES;
// 設(shè)置非校驗證書模式
sharedClient.securityPolicy.allowInvalidCertificates = YES;
[sharedClient.securityPolicy setValidatesDomainName:NO];
});
return sharedClient;
}
我還以為是下面3句話起作用了
((AFJSONResponseSerializer *)sharedClient.responseSerializer).removesKeysWithNullValues = YES;
// 設(shè)置非校驗證書模式
sharedClient.securityPolicy.allowInvalidCertificates = YES;
[sharedClient.securityPolicy setValidatesDomainName:NO];
后面經(jīng)過多次測試發(fā)現(xiàn)這個并沒有什么影響偿乖,主要問題是出在下面4句話上面
sharedClient.responseSerializer = [AFJSONResponseSerializer serializer];
sharedClient.requestSerializer = [AFJSONRequestSerializer serializer];
[sharedClient.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[sharedClient.requestSerializer setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
只要一設(shè)置這個击罪,后臺就拿不到我給他們的參數(shù)值。
但是不知道為啥設(shè)置了這個他們就拿不到我們傳的參數(shù)贪薪,去問了一下同事媳禁,他叫我抓包看看請求的request和response,恩画切,好注意竣稽,我看不太懂抓包的數(shù)據(jù),請來大神同伴過來幫忙看一下霍弹,下面是調(diào)用成功時返回的數(shù)據(jù)
再來看看把上面4行代碼加上毫别,設(shè)置了requestSerializer以后,后臺獲取不到數(shù)據(jù)的時的數(shù)據(jù)
我并沒有看出問題在哪里典格,同伴說設(shè)置了requestSerializer之后岛宦,我們傳過去的參數(shù)是json數(shù)據(jù)類型的,他們沒拿到钝计,如果不設(shè)置requestSerializer的話,我們傳過去的參數(shù)是Form表單數(shù)據(jù)齐佳。
問題終于解決了私恬。。炼吴。本鸣。。
雖然不知道到底是不是這個問題硅蹦,但是還是記錄一下整個下午解決這個問題的過程吧~
有知道這個問題到底是為啥的大神荣德,請指正,謝謝
慢慢來童芹,一步一個巴掌印~~~