2013-12-18 54 views
2

我一直在寻找一种方法来执行此如何使用AFNetworking 2.0

curl -u username:password -H "Content-Type: application/binary" \ 
    --data-binary @file.dat -X POST \ 
    "https://helpdesk.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" 

我试图用这个

[afnetworkmanager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

     [formData appendPartWithFileData:attachment.attachmentData name:@"image" fileName:attachment.fileName mimeType:attachment.mimeType]; 

    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     // TODO: 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // TODO: 
    }]; 

但它并没有帮助上传二进制数据。目前,我得到一个错误说

{ 
>  "Cache-Control" = "max-age=0, private, must-revalidate"; 
>  Connection = "keep-alive"; 
>  "Content-Length" = 345; 
>  Server = "nginx/1.4.2"; 
>  Status = "201 Created"; 
>  "X-Content-Type-Options" = nosniff; 
>  "X-Runtime" = "1.471856"; 
>  "X-UA-Compatible" = "IE=Edge,chrome=1"; 
>  "X-Zendesk-API-Version" = v2; 
>  "X-Zendesk-API-Warn" = "Removed restricted keys [\"image\"] from parameters according to whitelist"; } }, 

> NSLocalizedDescription=Request failed: unacceptable content-type: 
> text/plain} 

我不明白的地方我错了。

+0

Nalin,你如何提供zendesk认证?我也试图做到这一点,迄今还没有取得成功。你能发布允许这个工作的正确答案吗?谢谢! – rockfakie

回答

7

我最终通过使用AFURLSessionManager得到了这个工作。这里是完整的代码:

NSString *uploadAttachmentURL = @"https://mydomain.zendesk.com/api/v2/uploads.json?filename=screenshot.jpeg"; 

     NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
     _afHTTPSessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; 

     // hack to allow 'text/plain' content-type to work 
     NSMutableSet *contentTypes = [NSMutableSet setWithSet:_AFOpManager.responseSerializer.acceptableContentTypes]; 
     [contentTypes addObject:@"text/plain"]; 
     _afHTTPSessionManager.responseSerializer.acceptableContentTypes = contentTypes; 

     [_afHTTPSessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"[USERNAME]" password:@"[PASSWORD]"]; 



     [_afHTTPSessionManager POST:uploadAttachmentURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
      [formData appendPartWithFileData:imageData name:@"screenshot" fileName:@"photo.jpg" mimeType:@"image/jpeg"]; 
     } success:^(NSURLSessionDataTask *task, id responseObject) { 
      DDLogError(@"screenshot operation success! %@", responseObject); 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      DDLogError(@"Operation Error: %@", error); 
     }]; 
+0

这有帮助,谢谢 –

0

NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

configuration.HTTPAdditionalHeaders = @{@"CS090-Version":[NSString stringWithFormat:@"ios_%@",VERSION]; 

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:configuration]; 


    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:apiURL parameters:nil constructingBodyWithBlock:nil error:nil]; 

    NSURLSessionUploadTask *uploadTask; 
    uploadTask = [manager uploadTaskWithRequest:request fromData:imgData progress:nil completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
     if (error) { 
      NSLog(@"Error: %@", error); 
     } else { 
      NSLog(@"%@ %@", response, responseObject); 
     } 
    }]; 

    [uploadTask resume];