iOS AFNetworking發送Raw數據

1、什麼是Raw數據javascript

所謂Raw數據就是排除按照HTTP指定的key=value或者文件數據,典型的XML與JSON即是Raw數據。網上有不少發送JSON或者XML的都是錯誤的,有些人自認爲設置個請求頭便可,其實內容須要經過body以字符串方式發送,好比發送base64字符串同樣。html

 

2、發送xmljava

簡單的發送xml使用原生的API可能最好,若是使用afnetworking該怎麼作呢?json

+ (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;
     }];

 

2、發送JSON數據服務器

JSON其實和XML相似,也可使用如上方式發送。app

可是這種發送方式顯得不夠理解,下面是一種相對容易理解的方式異步

/**
 *  異步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發送也可使用此方式改造,這裏就不在贅述。post

 

3、如何發送Base64編碼的字符串,服務器經過IO流接收呢?編碼

這個問題留給你們了。

相關文章
相關標籤/搜索