記錄一下今天下午爬了一下午的坑吧~
前幾天新開一個新的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ù)。
沒辦法了,問題應該就是在我們iOS這邊了,一步步的走請求的流程也沒看出什么不一樣的啊。。。。。我也不能改AFN的內(nèi)部代碼吧
試了幾次發(fā)現(xiàn)問題并沒有解決,然后就灰溜溜的拿上一個項目的網(wǎng)絡請求試了一下,結(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;
// 設置非校驗證書模式
sharedClient.securityPolicy.allowInvalidCertificates = YES;
[sharedClient.securityPolicy setValidatesDomainName:NO];
});
return sharedClient;
}
我還以為是下面3句話起作用了
((AFJSONResponseSerializer *)sharedClient.responseSerializer).removesKeysWithNullValues = YES;
// 設置非校驗證書模式
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ù),去問了一下同事,他叫我抓包看看請求的request和response,恩,好注意,我看不太懂抓包的數(shù)據(jù),請來大神同伴過來幫忙看一下,下面是調(diào)用成功時返回的數(shù)據(jù)

再來看看把上面4行代碼加上,設置了requestSerializer以后,后臺獲取不到數(shù)據(jù)的時的數(shù)據(jù)

我并沒有看出問題在哪里,同伴說設置了requestSerializer之后,我們傳過去的參數(shù)是json數(shù)據(jù)類型的,他們沒拿到,如果不設置requestSerializer的話,我們傳過去的參數(shù)是Form表單數(shù)據(jù)。

問題終于解決了。。。。。
雖然不知道到底是不是這個問題,但是還是記錄一下整個下午解決這個問題的過程吧~
有知道這個問題到底是為啥的大神,請指正,謝謝
慢慢來,一步一個巴掌印~~~