iOS AFNetworking发送Raw数据

一、什么是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流接收呢?

这个问题留给大家了。

 

转载于:https://my.oschina.net/ososchina/blog/1607420

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值