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

后端 未结 6 986
执念已碎
执念已碎 2020-12-15 22:20

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 b

相关标签:
6条回答
  • 2020-12-15 22:58

    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.

    0 讨论(0)
  • 2020-12-15 22:58

    Please use below method.

    +(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];
    }
    
    0 讨论(0)
  • 2020-12-15 23:03

    You can use multipartFormRequestWithMethod method as following:

    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 讨论(0)
  • 2020-12-15 23:07

    Here you have an example sending a raw json:

    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];
    
    0 讨论(0)
  • 2020-12-15 23:15

    I'm using AFNetworking 2.5.3 and create new POST method for 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)
        }
    
    }
    
    0 讨论(0)
  • 2020-12-15 23:18
     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 讨论(0)
提交回复
热议问题