//
// httpsClass.h
// https
//
// Created by 夏 科傑 on 12-12-20.
// Copyright (c) 2012年 夏 科傑. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface httpsClass : NSObject
{
NSMutableURLRequest* _request;
NSURLConnection * connection;
NSStringEncoding enc;
NSURLAuthenticationChallenge *_challenge;
NSMutableData* muData;
bool isFinish;
}
-(NSString *)initWithUrl:(NSString* )url postData:(NSString* )data;
@end
//
// httpsClass.m
// https
//
// Created by 夏 科傑 on 12-12-20.
// Copyright (c) 2012年 夏 科傑. All rights reserved.
//
#import "httpsClass.h"
@implementation httpsClass
-(NSString *)initWithUrl:(NSString* )requestUrl postData:(NSString* )data
{
enc=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
_request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestUrl]];
NSData *aData = [data dataUsingEncoding: NSUTF8StringEncoding];
[_request setHTTPMethod: @"POST"];
[_request setHTTPBody:aData];
assert(_request != nil);
connection = [NSURLConnection connectionWithRequest:_request delegate:self];
[self _receiveDidStart];
if(connection)
{
muData = [[NSMutableData data] retain];
NSLog(@"intial done!");
}
else
{
NSLog(@"sorry");
}
isFinish=NO;
while(!isFinish) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
NSLog(@"%@",muData);
return [[NSString alloc] initWithData:muData encoding:NSUTF8StringEncoding];
}
#pragma mark - Tell the UI we are receiving or received.
- (void)_receiveDidStart
{
NSLog(@"receiving");
}
- (void)_receiveDidStopWithStatus:(NSString *)statusString
{
if (statusString == nil) {
NSLog(@"Get succeeded");
}else
NSLog(@"Get not succeeded");
// NSLog(@"---%@",statusString);
}
- (void)_stopReceiveWithStatus:(NSString *)statusString
{
if (connection != nil) {
[connection cancel];
connection = nil;
}
if (_challenge !=nil) {
[_challenge release];
}
[self _receiveDidStopWithStatus:statusString];
}
- (BOOL)connection:(NSURLConnection *)conn canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"authenticate method:%@",protectionSpace.authenticationMethod);
return [protectionSpace.authenticationMethod isEqualToString:
NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)conn didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"%@",challenge);
_challenge=[challenge retain];
NSURLCredential * credential;
NSURLProtectionSpace * protectionSpace;
SecTrustRef trust;
NSString * host;
SecCertificateRef serverCert;
//三次握手
assert(_challenge !=nil);
protectionSpace = [_challenge protectionSpace];
assert(protectionSpace != nil);
trust = [protectionSpace serverTrust];
assert(trust != NULL);
credential = [NSURLCredential credentialForTrust:trust];
assert(credential != nil);
host = [[_challenge protectionSpace] host];
if (SecTrustGetCertificateCount(trust) > 0) {
serverCert = SecTrustGetCertificateAtIndex(trust, 0);
} else {
serverCert = NULL;
}
[[_challenge sender] useCredential:credential forAuthenticationChallenge:_challenge];
}
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse *) response;
assert( [httpResponse isKindOfClass:[NSHTTPURLResponse class]] );
if ((httpResponse.statusCode / 100) != 2) {
[self _stopReceiveWithStatus:[NSString stringWithFormat:@"HTTP error %zd", (ssize_t) httpResponse.statusCode]];
} else {
NSLog(@"status: ok");
}
//NSLog(@"%@",httpResponse);
NSLog(@"get the whole response");
[muData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"get some data");
[muData appendData:data];//返回數據
}
- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
{
NSLog(@"didFailWithError %@", error);
[self _stopReceiveWithStatus:@"Connection failed"];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
#pragma unused(conn)
NSLog(@"connectionDidFinishLoading");
isFinish=YES;
[self _stopReceiveWithStatus:nil];
}
@end
調用方法
http=[httpsClass new];
NSString *postPram = [NSString stringWithFormat:@"requestData={\"api_Channel\":\"3\",\"api_name\":\"api.news.find_article_weekly_daily_news_list\",\"params\":{\"type\":%d,\"pageNo\":%d,\"pageSize\":%d}}",1,1,10];
NSLog(@"%@",[http initWithUrl:@"https://**.**.**.**/api/x.htm" postData:postPram]);
就會打印你需要的返回值。