2012-01-25 50 views
2

我已經開始使用AFNetworking,並且它在進行簡單的「GET」請求時運行良好。但是現在我正在嘗試做一個「POST」 - 請求。我使用下面的代碼來執行「GET」請求。在查看 puthPath AFHTTPClient時,無法設置要用於主體的數據。我的猜測是有另一種解決方法。我一直在尋找 AFHTTPOperation作爲解決這個問題的方法。但是我沒有得到這個工作。問題是我不知道如何在基本身份驗證中使用它。如何使用AFNetworking爲「PUT」請求設置數據?

有人能給我提示如何做一個簡單的「POST」 - 與AFNetworking的請求?

AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:ServerURL]; 
[client setAuthorizationHeaderWithUsername:self.username 
            password:self.password]; 

NSString* resourcePath = [NSString stringWithFormat:@"/some/resource/%@", 
          endPath]; 

[client getPath:resourcePath 
    parameters:nil 
     success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      // Success code omitted 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      // Some error handling code omitted 
     } 
]; 
+0

我不能回答我自己的問題,因爲低信譽。因此我發佈了這條評論。當我有可能這樣做時,我會將其作爲答案發布。 如果沒有找到任何簡單的方法來解決這個問題,使用'code'AFHTTPClient'code'。然而,我做了一個子類來'代碼'AFHTTPClient'code',這實際上是在AFNetworking文檔中推薦的。 –

回答

13

我沒有找到任何簡單的方法來做到這一點。但我按照建議並創建了我自己的子類 AFHTTPClient。在子類中,我實現了下面的方法。這使得可以使用我自己的數據執行POST請求& PUT請求。

- (void)postPath:(NSString *)path 
    parameters:(NSDictionary *)parameters 
     data:(NSData*)data 
    success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 
{ 
    NSURLRequest *request = [self requestWithMethod:@"POST" path:path  parameters:parameters data:data]; 
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; 
    [self enqueueHTTPRequestOperation:operation]; 
} 

- (void)putPath:(NSString *)path 
    parameters:(NSDictionary *)parameters 
      data:(NSData*)data 
     success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 
{ 
    NSURLRequest *request = [self requestWithMethod:@"PUT" path:path parameters:parameters data:data]; 
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; 
[self enqueueHTTPRequestOperation:operation]; 
} 

-(NSMutableURLRequest*)requestWithMethod:(NSString *)method 
            path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
           data:(NSData*)data; 
{ 
    NSMutableURLRequest* request = [super requestWithMethod:method 
                 path:path 
               parameters:parameters]; 

    [request setHTTPBody:data]; 

    return request; 
} 
+3

您無法直接設置數據。解決方案: NSMutableURLRequest * request = [self requestWithMethod:@「POST」path:path parameters:parameters]; [request setHTTPBody:data]; – Justin

0

隨着AFNetworking 1.3.2下面的代碼工作對我來說:

NSData *imageData = UIImageJPEGRepresentation(thumb, 0.85F); 

AFHTTPClient *httpClient = [[AFHTTPClient alloc] 
    initWithBaseURL:[NSURL URLWithString:@"https://example.com/"]]; 
NSMutableURLRequest *request = [httpClient 
    requestWithMethod:@"PUT" path:@"/foo" parameters:nil]; 
[request setHTTPBody:imageData]; 
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"]; 

AFHTTPRequestOperation *operation = [httpClient 
    HTTPRequestOperationWithRequest:request 
     success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response) { 
      NSLog(@"%@", response); 
     } 
     failure:^(AFHTTPRequestOperation *op, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[operation start]; 

這導致與正確的標題PUT請求,內容Lenght和:-)

3

與一般RESTfulness AFNetworking 2.0,我剛剛從

- (AFHTTPRequestOperation *)PUT:(NSString *)URLString 
       parameters:(id)parameters 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

複製代碼,並添加一個

[request setHTTPBody:data]; 

這裏是:

NSString* str = [bookDetailLink objectForKey:@"Body"]; 
NSData* data = [str dataUsingEncoding: NSUTF8StringEncoding]; 
    NSMutableURLRequest *request = [self.manager.requestSerializer requestWithMethod:@"PUT" URLString:bookingDetailUrl parameters:nil error:nil]; 

[request setHTTPBody:data]; 
AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request 
                    success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response) { 
                     NSLog(@"%@", response); 
                    } 
                    failure:^(AFHTTPRequestOperation *op, NSError *error) { 
                     NSLog(@"%@", error); 
                    }]; 

[self.manager.operationQueue addOperation:operation]; 

我使用AFNetworking整合使用Skyscanner API我們的iOS應用。

+0

完美答案!救了我 !! – Jyotsna

相關問題