使用AFN请求webServices接口
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
或者更简单地说:SOAP 是用于访问网络服务的协议。详细了解SOAP:http://www.w3school.com.cn/soap/soap_intro.asp
第一:我们的问题是怎么请求ws接口数据,第二:请求到的数据如何解析
先说第一个问题
我们先写一个请求数据的类SOAPRequest,便于调用
+(NSString*)defautldefaultSoapMesage:(NSString*)methodName params:(NSDictionary *)dic
{
NSError *parsError = nil;
NSData *jsonDatas = [NSJSONSerialization dataWithJSONObject:dic
options:NSJSONWritingPrettyPrinted
error:&parsError];
NSString *info =[[NSString alloc] initWithData:jsonDatas
encoding:NSUTF8StringEncoding];
NSString *soapMsg = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
"<soap:Body>\n"
"<g:%@ xmlns:g=\"http://ws.chat.tianjian.com/\">\n"
"<attr>%@</attr>\n"
"</g:%@>"
"</soap:Body>\n"
"</soap:Envelope>\n"
,methodName,info,methodName];
return soapMsg;
}
写一个类名字ChatRequestTool用来请求数据
+ (void)getBasicInfoWithParam:(NSDictionary *)param success:(void (^)(id))success failure:(void (^)(NSError *error))failure
{//获取个人信息
NSString *soapMeg = [SOAPRequest defautldefaultSoapMesage:@"getBasicInfo" params:param];//此处调用方法defautldefaultSoapMesage,传入方法名和参数
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
[manager.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapMeg;
}];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager POST:ChatURL_Service parameters:soapMeg success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
第二个问题,请求下来的数据进行解析,此处使用Google开发的XML解析库
+(NSDictionary *)dictionaryFromeResponseString:(NSString *)resopse
{
NSLog(@"resopse %@",resopse);
GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithXMLString:resopse options:0 error:nil];
GDataXMLElement *xmlEle = [xmlDoc rootElement];
NSArray *array = [xmlEle children];
NSLog(@"count : %d", [array count]);
for (int i = 0; i < [array count]; i++) {
GDataXMLElement *ele = [array objectAtIndex:i];
GDataXMLNode *themeURLNode = [ele attributeForName:@"userInfo"];//字符串
NSString *themeURL = themeURLNode.stringValue;
NSLog(@"%@",themeURL);
// 根据标签名判断
if ([[ele name] isEqualToString:@"name"]) {
// 读标签里面的属性
NSLog(@"name --> %@", [[ele attributeForName:@"value"] stringValue]);
} else {
// 直接读标签间的String
NSLog(@"age --> %@", [ele stringValue]);
NSError *error = nil;
NSDictionary *string2dic = [NSJSONSerialization JSONObjectWithData: [[ele stringValue] dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
return string2dic;
}
}
return nil;
}
---------------------------------调用方法返回解析数据---------------------------------
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:securityUserBaseInfoId,@"securityUserBaseInfoId",hspConfigBaseInfoId,@"hspConfigBaseInfoId",flagHspOrSecurity,@"flagHspOrSecurity",userName,@"userName",@"",@"deptId",@"",@"deptName",tenantId,@"tenantId", nil];
DLog(@"%@",info);
[ChatRequestTool getBasicInfoWithParam:info success:^(id responseObject) {
NSString *response = [[NSString alloc] initWithData:(NSData *)responseObject encoding:NSUTF8StringEncoding];
NSDictionary *infoDic = [SOAPRequest dictionaryFromeResponseString:response];
//此处调用方法dictionaryFromeResponseString,解析数据
NSLog(@"获得个人基本信息==%@",infoDic);
}else{
}
} failure:^(NSError *error) {
NSLog(@"error == %@", error);
}];
方法的调用是从下往上看的哈