一、什么是Raw数据
所谓Raw数据就是排除按照HTTP指定的key=value或者文件数据,典型的XML与JSON便是Raw数据。网上有很多发送JSON或者XML的都是错误的,有些人自认为设置个请求头即可,其实内容需要通过body以字符串方式发送,比如发送base64字符串一样。
二、发送xml
简单的发送xml使用原生的API可能最好,如果使用afnetworking该怎么做呢?
+ (NSString *)getSOAPString:(NSString *)parame interface:(NSString *)interf
{
NSString *soapStr = [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:Header>\n"
"<WyxSoapHeader xmlns=\"http://www.wincansoft.com/wyxsms\">\n"
"<UserID>xxx/UserID>\n"
"<UserPW>xxx</UserPW>\n"
"</WyxSoapHeader>\n"
"</soap:Header>\n"
"<soap:Body>\n"
"<%@ xmlns=\"http://www.wincansoft.com/wyxsms\">\n"
"%@"
"</%@>\n"
"</soap:Body>\n"
"</soap:Envelope>\n",interf,parame,interf];
return soapStr;
}
NSString *soapStr = [UIUtils getSOAPString:[UIUtils getParameters:这里是参数字典] interface:@"这里是接口方法"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 返回NSData
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 设置请求头,也可以不设置,看自己的需求解开注释,一般不需要
[manager.requestSerializer setValue:@"http://www.wincansoft.com/wyxsms/QueryUserID" forHTTPHeaderField:@"SOAPAction"];
[manager.requestSerializer setValue:@"51serapp.wincansoft.net" forHTTPHeaderField:@"Host"];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
// 这个设置是必须的
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
// 设置HTTPBody
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error){
return soapStr;
}];
[manager POST:URLString parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dicRes = [NSDictionary dictionaryWithXMLData:responseObject];
NSLog(@"JSON: - %@", dicRes);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
以上重点部分是,否则你无法发出数据
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error){
return soapStr;
}];
二、发送JSON数据
JSON其实和XML类似,也可以使用如上方式发送。
但是这种发送方式显得不够理解,下面是一种相对容易理解的方式
/**
* 异步POST请求:以body方式,支持数组
*
* @param url 请求的url
* @param body body数据
* @param show 是否显示HUD
* @param success 成功回调
* @param failure 失败回调
*/
- (void)postWithUrl:(NSString *)url body:(NSData *)body showLoading:(BOOL)show success:(void(^)(NSDictionary *response))success failure:(void(^)(NSError *error))failure
{
WS(weakSelf);
if (show) {
[weakSelf showLoading];
}
NSString *requestUrl = [NSString stringWithFormat:@"%@%@", kBaseUrl, url];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:requestUrl parameters:nil error:nil];
request.timeoutInterval= TIME_OUT_INTERVAL;
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// 设置body
[request setHTTPBody:body];
AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
@"text/html",
@"text/json",
@"text/javascript",
@"text/plain",
nil];
manager.responseSerializer = responseSerializer;
[[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
if (show) {
[weakSelf dismissLoading];
}
success([weakSelf processResponse:responseObject]);
} else {
failure(error);
[weakSelf showErrorMessage];
ILog(@"request error = %@",error);
}
}] resume];
}
注意:xml发送也可以使用此方式改造,这里就不在赘述。
三、如何发送Base64编码的字符串,服务器通过IO流接收呢?
这个问题留给大家了。