2013-06-18 19 views
12

Tôi đang cố thực hiện yêu cầu HTTP PUT bằng cách sử dụng AFNetworking để tạo tệp đính kèm trong máy chủ CouchDB. Máy chủ dự kiến ​​một chuỗi được mã hóa base64 trong phần thân HTTP. Làm thế nào tôi có thể thực hiện yêu cầu này mà không cần gửi thân HTTP như một cặp khóa/giá trị sử dụng AFNetworking?AFNetworking - Làm cách nào để PUT và POST dữ liệu thô mà không cần sử dụng cặp giá trị khóa?

tôi bắt đầu bằng cách nhìn vào phương pháp này:

- (void)putPath:(NSString *)path 
parameters:(NSDictionary *)parameters 
    success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

Nhưng ở đây các thông số là đến là loại: NSDictionary. Tôi chỉ muốn gửi một chuỗi mã hóa base64 trong cơ thể HTTP nhưng không được liên kết với một khóa. Ai đó có thể chỉ cho tôi phương pháp thích hợp để sử dụng không? Cảm ơn!

Trả lời

11

Hejazi là đơn giản và nên làm việc tuyệt vời.

Nếu vì một lý do nào đó, bạn cần phải rất cụ thể cho một yêu cầu - ví dụ: nếu bạn cần ghi đè tiêu đề, v.v. - bạn cũng có thể cân nhắc tạo NSURLRequest của riêng mình.

Dưới đây là một số (chưa được kiểm tra) mẫu mã:

// Make a request... 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL]; 

// Generate an NSData from your NSString (see below for link to more info) 
NSData *postBody = [NSData base64DataFromString:yourBase64EncodedString]; 

// Add Content-Length header if your server needs it 
unsigned long long postLength = postBody.length; 
NSString *contentLength = [NSString stringWithFormat:@"%llu", postLength]; 
[request addValue:contentLength forHTTPHeaderField:@"Content-Length"]; 

// This should all look familiar... 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:postBody]; 

AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure]; 
[client enqueueHTTPRequestOperation:operation]; 

Các NSData loại phương pháp base64DataFromStringavailable here.

+0

u có thể giúp tôi ở đây: http://stackoverflow.com/questions/22071188/afjsonparameterencoding-in-afnetworking-2-x-x – CRDave

+0

khách hàng ở đây là gì? –

+0

@ChitraKhatri Đây là một ví dụ 'AFHTTPClient' (từ AFNetworking 1, nó không còn tồn tại trong AFNetworking 2) –

4

Bạn có thể sử dụng phương pháp multipartFormRequestWithMethod như sau: Câu trả lời

NSURLRequest *request = [self multipartFormRequestWithMethod:@"PUT" path:path parameters:parameters constructingBodyWithBlock:^(id <AFMultipartFormData> formData) { 
    [formData appendString:<yourBase64EncodedString>] 
}]; 
AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure]; 
[client enqueueHTTPRequestOperation:operation]; 
0

Tôi đang sử dụng AFNetworking 2.5.3 và tạo phương thức POST mới cho AFHTTPRequestOperationManager.

extension AFHTTPRequestOperationManager { 

    func POST(URLString: String!, rawBody: NSData!, success: ((AFHTTPRequestOperation!, AnyObject!) -> Void)!, failure: ((AFHTTPRequestOperation!, NSError!) -> Void)!) { 

     let request = NSMutableURLRequest(URL: NSURL(string: URLString, relativeToURL: baseURL)!) 
     request.HTTPMethod = "POST" 
     request.HTTPBody = rawBody 

     let operation = HTTPRequestOperationWithRequest(request, success: success, failure: failure) 

     operationQueue.addOperation(operation) 
    } 

} 
3

Ở đây bạn có một ví dụ gửi một json liệu :

NSDictionary *dict = ... 
NSError *error; 
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict 
                  options:NSJSONWritingPrettyPrinted 
                  error:&error]; 

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:YOUR_URL parameters:nil error:nil]; 

req.timeoutInterval = 30; 
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[req setValue:IF_NEEDED forHTTPHeaderField:@"Authorization"]; 

[req setHTTPBody:dataFromDict]; 

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
    if (!error) { 
     NSLog(@"%@", responseObject); 
    } else { 
     NSLog(@"Error: %@, %@, %@", error, response, responseObject); 
    } 
}] resume]; 
1
NSData *data = someData; 
NSMutableURLRequest *requeust = [NSMutableURLRequest requestWithURL:   
[NSURL URLWithString:[self getURLWith:urlService]]]; 

[reqeust setHTTPMethod:@"PUT"]; 
[reqeust setHTTPBody:data]; 
[reqeust setValue:@"application/raw" forHTTPHeaderField:@"Content-Type"]; 

NSURLSessionDataTask *task = [manager uploadTaskWithRequest:requeust fromData:nil progress:^(NSProgress * _Nonnull uploadProgress) { 

} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

}]; 
[task resume]; 
0

Vui lòng sử dụng dưới đây phương pháp.

+(void)callPostWithRawData:(NSDictionary *)dict withURL:(NSString 
*)strUrl withToken:(NSString *)strToken withBlock:(dictionary)block 
{ 
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
Please use below method. 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@/%@",WebserviceUrl,strUrl] parameters:nil error:nil]; 

req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; 
[req setValue:strToken forHTTPHeaderField:@"Authorization"]; 
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
    if (!error) { 
     if ([responseObject isKindOfClass:[NSData class]]) { 
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
      if ((long)[httpResponse statusCode]==201) { 
       NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
       [dict setObject:@"201" forKey:@"Code"]; 

       if ([httpResponse respondsToSelector:@selector(allHeaderFields)]) { 
        NSDictionary *dictionary = [httpResponse allHeaderFields]; 
        NSLog(@"%@",[dictionary objectForKey:@"Location"]); 
        [dict setObject:[NSString stringWithFormat:@"%@",[dictionary objectForKey:@"Location"]] forKey:@"Id"]; 
        block(dict); 
       } 
      } 
      else if ((long)[httpResponse statusCode]==200) { 
       //Leave Hours Calculate 
       NSDictionary *serializedData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil]; 
       block(serializedData); 
      } 
      else{ 
      } 
     } 
     else if ([responseObject isKindOfClass:[NSDictionary class]]) { 
      block(responseObject); 
     } 
    } else { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
     [dict setObject:ServerResponceError forKey:@"error"]; 
     block(dict); 
    } 
}] resume]; 
}