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流接收呢?編碼
這個問題留給你們了。