前段时间遇到了一个问题花了一段时间去解决,其主要涉及到webview的post请求和https访问以及GBK和URL编码
最后解决方案如下:
1.POST请求的写法:
NSURL *url = [NSURL URLWithString:_url];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
[request setHTTPMethod: @"POST"];
NSString *body = [NSString stringWithFormat:@"sign=%@&orig=%@&returnurl=%@&NOTIFYURL=%@",_dic[@"params"][@"sign"],_dic[@"params"][@"orig"],_dic[@"params"][@"returnurl"],_dic[@"params"][@"NOTIFYURL"]];
[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
[_webView loadRequest: request];
2.访问HTTPS
由于访问https需要涉及到信任网站的问题,否则会报8013错误,使用了以下方法:
#import <Foundation/Foundation.h>
@interface NSURLRequest (SSL)
+(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host;
+(void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host;
@end
#import "NSURLRequest+SSL.h"
@implementation NSURLRequest (SSL)
+(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host
{
return YES;
}
+(void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host
{
}
@end
导入#import "NSURLRequest+SSL.h"后,
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:@"https"];
3.由于当时需要对post进行URL编码/GBK编码 当时就使用了一下方法:
NSString *body = [NSString stringWithFormat:@"sign=%@&orig=%@&returnurl=%@&NOTIFYURL=%@",[self encodeString:_dic[@"params"][@"sign"]] ,[self encodeString:_dic[@"params"][@"orig"]],[self encodeString:_dic[@"params"][@"returnurl"]],[self encodeString:_dic[@"params"][@"NOTIFYURL"]]];
unsigned long encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingHZ_GB_2312);//GBK编码
[request setHTTPBody:[body dataUsingEncoding:encode]];
//URL编码
-(NSString*)encodeString:(NSString*)unencodedString{
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}