1.怎么創(chuàng)建post的web請求
我們平常都是比較熟悉get方式的請求方式,post用的比較少,但是在類似支付頁面的調(diào)用上回用到,用法如下
使用場景:url為基本url,dic為多個參數(shù)要post的參數(shù),for中為了拼接body體
NSURL *url = [NSURL URLWithString:self.webURL];
NSString *bodyStr = @"";
for (NSString *keyStr in self.dic) {
NSString *andStr = bodyStr.length < 1?@"":@"&";
NSString *aaa = self.dic[keyStr];
NSString *iiii = [aaa URLEncodedString];//轉(zhuǎn)為URL字符
bodyStr = [bodyStr stringByAppendingString:[NSString stringWithFormat:@"%@%@=%@",andStr,keyStr,iiii]];
}
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody: [bodyStr dataUsingEncoding: NSUTF8StringEncoding]];
[_webV loadRequest: request];
2.iOS中URL特殊字符的轉(zhuǎn)換問題
上述中 代碼:NSString *iiii = [aaa URLEncodedString];//轉(zhuǎn)為URL字符
//轉(zhuǎn)換為URL編碼
- (NSString *)URLEncodedString
{
// CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
// CharactersToLeaveUnescaped = @"[].";
NSString *unencodedString = self;
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
//還原
-(NSString *)URLDecodedString
{
//NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ];
NSString *encodedString = self;
NSString *decodedString? = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
(__bridge CFStringRef)encodedString,
CFSTR(""),
CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}
上述方法是為了轉(zhuǎn)換特殊字符的問題,但是已經(jīng)警告不要用了,并提供了代替方法stringByAddingPercentEncodingWithAllowedCharacters,該方法的用法是:
NSString *iiii = [aaa stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
但是使用中又發(fā)現(xiàn)"+""="等(其他待補充)url中的字符沒有轉(zhuǎn)換過來,找了很多方式?jīng)]找到更好的解決方式,只能使用如下比較笨的方式
iiii = [iiii stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
iiii = [iiii stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"];
3.web頁面打開空白的解決方法
遇到一些支付頁面由于需要允許證書接收,所以會一直空白,并且控制臺輸出
CFStreamErrorDomainSSL, -9813
解決方法:在appdelegate.m中,@end后面加上
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}