1. MKNetworkEngine * engine = [[MKNetworkEngine alloc] init];
2. MKNetworkOperation * operation = [engine operationWithURLString:oprURLstr params:nil httpMethod:httpMethods];
3. NSDictionary *dic=[LJHeartBeat getDic:dele.errorstr]; //LJHeartBeat中封装的类方法 getDic:
4. [operation addHeaders:dic]; // HTTTP Digest认证,详见下面:第7
5. operation.postDataEncoding = MKNKPostDataEncodingTypeCustom;
[operation setCustomPostDataEncodingHandler:^NSString *(NSDictionary *postDataDict) {
NSLog(@"此处为请求消息体%@",[[NSString alloc] initWithData:Reqdata encoding:NSUTF8StringEncoding]);
return [[NSString alloc] initWithData:Reqdata encoding:NSUTF8StringEncoding];
} forType:@"application/xml"
];
6. [operation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
NSLog(@"完成请求数据%@ 完成请求字符串%@",completedOperation.responseData,completedOperation.responseString);
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
NSLog(@"%@",error);
}];
[engine enqueueOperation:operation];
operation.postDataEncoding = MKNKPostDataEncodingTypeCustom;
[operation setCustomPostDataEncodingHandler:^NSString *(NSDictionary *postDataDict) {
NSLog(@"此处为请求消息体%@",[[NSString alloc] initWithData:Reqdata encoding:NSUTF8StringEncoding]);
return [[NSString alloc] initWithData:Reqdata encoding:NSUTF8StringEncoding];
} forType:@"application/xml"
];
-------------------------------------------------------------
+(NSDictionary *)getDic:(NSString *)errorStr
{
User *newUser = [User sharedInstance];
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
newUser.userId=[defaults objectForKey:@"userid"];
NSLog(@"%@",errorStr);
// 获取realm
NSString *RealmStr=[self getRealmStrWithErrorStr:errorStr];
// 获取nounce
NSString *nounceStrStr=[self getNounceStrWithErrorStr:errorStr];
NSString *responseAfterMd5=[self getRsponseStrWithErrorStr:errorStr];
NSString *useridquota=[self afterAddQuotationFor:newUser.userId];
NSString *strdic=[NSString stringWithFormat:@"Digest userId=\"%@\",nonce=\"%@\",realm=\"%@\",response=\"%@\",uri=\"%@\"",newUser.userId,nounceStrStr,RealmStr,responseAfterMd5,KHEART];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:strdic,@"Authorization" ,nil];
return dic;
}
+(NSString *)afterAddQuotationFor:(NSString *)PassStr
{
NSString *str=[NSString stringWithFormat:@"\"%@\"",PassStr];
return str;
}
+(NSString *)getRsponseStrWithErrorStr:(NSString *)errorStr
{
User *newUser=[[User alloc]init];
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
newUser.userId=[defaults objectForKey:@"userid"];
newUser.password=[defaults objectForKey:@"password"];
NSString *psdAfterMd5=[self md5String:newUser.password];
// 获取realm
NSString *RealmStr=[self getRealmStrWithErrorStr:errorStr];
NSString *ha1Str=[NSString stringWithFormat:@"%@:%@:%@",newUser.userId,RealmStr,psdAfterMd5];
NSString *ha2Str=[NSString stringWithFormat:@"%@:%@",@"POST",@"/sklcloud/skl-cloud/app/Security/AAA/users/heartBeat"];
NSString *ha1StrAfterMd5=[self md5String:ha1Str];
NSString *ha2StrAfterMd5=[self md5String:ha2Str];
// 获取nounce
NSString *nounceStrStr=[self getNounceStrWithErrorStr:errorStr];
NSString *responseStr=[NSString stringWithFormat:@"%@,%@:%@",ha1StrAfterMd5,nounceStrStr,ha2StrAfterMd5];
NSString *responseAfterMd5=[self md5String:responseStr];
NSLog(@"%@",responseAfterMd5);
return responseAfterMd5;
}
+(NSString *)getNounceStrWithErrorStr:(NSString *)errorStr
{
// Error Domain=NSURLErrorDomain Code=401 "The operation couldn’t be completed. (NSURLErrorDomain error 401.)" UserInfo=0x7f80f2e4b370 {Transfer-Encoding=Identity, Content-Language=zh-CN, Www-Authenticate=Digest realm="@host.com", nonce="c4d361e697a63e36dbb01c52a92230b7", Server=Apache-Coyote/1.1,
NSString *nounceStr=nil;
if ([errorStr containsString:@"Code=401"])
{
NSRange range1=[errorStr rangeOfString:@"nonce="];
NSRange range={range1.location+range1.length+1,32};
nounceStr =[errorStr substringWithRange:range];
NSLog(@"%@",nounceStr);
}
return nounceStr;
}
+(NSString *)getRealmStrWithErrorStr:(NSString *)errorStr
{
// 判断code是否是401 是的话就执行 否则return
// Error Domain=NSURLErrorDomain Code=401 "The operation couldn’t be completed. (NSURLErrorDomain error 401.)" UserInfo=0x7fea0877d950 {Transfer-Encoding=Identity, Content-Language=zh-CN, Www-Authenticate=Digest realm="@host.com", nonce="673426f2b11200d6844495c4114bd791", Server=Apache-Coyote/1.1, Date=Mon, 11 May 2015 05:32:46 GMT}
NSString *realmStr=nil;
if ([errorStr containsString:@"Code=401"])
{
NSRange range1=[errorStr rangeOfString:@"realm="];
NSRange range2=[errorStr rangeOfString:@".com"];
NSRange range={range1.location + range1.length+1 ,range2.location+range2.length-range1.location-range1.length-1};
NSLog(@"%@",NSStringFromRange(range));
realmStr=[errorStr substringWithRange:range];
NSLog(@"%@",realmStr);
}
return realmStr;
}