Search code examples
iosobjective-crestafnetworking

AFNetworking - How can I PUT and POST raw data without using a key value pair?


I am trying to make an HTTP PUT request using AFNetworking to create an attachment in a CouchDB server. The server expects a base64 encoded string in the HTTP body. How can I make this request without sending the HTTP body as a key/value pair using AFNetworking?

I began by looking at this method:

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

But here the parameters are to be of type: NSDictionary. I just want to send a base64 encoded string in the HTTP body but not associated with a key. Can someone point me to the appropriate method to use? Thanks!


Solution

  • Hejazi's answer is simple and should work great.

    If, for some reason, you need to be very specific for one request - for example, if you need to override headers, etc. - you can also consider building your own NSURLRequest.

    Here's some (untested) sample code:

    // 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];
    

    The NSData category method base64DataFromString is available here.