前段時間遇到了一個問題花了一段時間去解決,其主要涉及到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;
}