1.怎么创建post的web请求
我们平常都是比较熟悉get方式的请求方式,post用的比较少,但是在类似支付页面的调用上回用到,用法如下
使用场景:url为基本url,dic为多个参数要post的参数,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];//转为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特殊字符的转换问题
上述中 代码:NSString *iiii = [aaa URLEncodedString];//转为URL字符
//转换为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;
}
上述方法是为了转换特殊字符的问题,但是已经警告不要用了,并提供了代替方法stringByAddingPercentEncodingWithAllowedCharacters,该方法的用法是:
NSString *iiii = [aaa stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
但是使用中又发现"+""="等(其他待补充)url中的字符没有转换过来,找了很多方式没找到更好的解决方式,只能使用如下比较笨的方式
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;
}