簡體   English   中英

如何在iOS Objective C中發送包含多部分表單數據的放置請求?

[英]How to send put request with multipart form data in iOS objective c?

想要發送帶有圖像和字符串數據的放置請求。這是我的代碼,以供進一步參考。

+(void)uploadProfileImage:(NSData*)imageData forDeviceNumber:    (NSString*)number withDelegate:(id)delegate{

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [[NSUserDefaults standardUserDefaults] setObject:@"Profile Image Upload" forKey:@"WHARRU_CALLED_API"];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
    [SharableClass addLogForAPI:@"Profile Image Upload" withtimeStamp:[dateFormatter stringFromDate:[NSDate date]] message:@"API Called." withDelegate:delegate];
    [[NSUserDefaults standardUserDefaults] synchronize];


    NSString *parameter = @"\{\"deviceId\" : \"919555347279\", \"name\" : \"intervention\", \"emergencyContacts\" : \"10046\", \"photo\" : \"10046\"}"; // The rest of your parmas here

    ////////////////////////////////////////////////////

    NSString *registeredServer = [SharableClass getDataFromDBForKey:@"server"];
    NSString *APIURL = @"/api/updateProfile/updateImage";
    NSString *urlString = [NSString stringWithFormat:@"%@%@", registeredServer, APIURL];
    NSLog(@"\n\nURL String\n%@\n\n", urlString);
    NSURL *url = [NSURL URLWithString:urlString];

    NSString *urlString2 = @"img/logo.png";
    NSData* file =  [NSData dataWithContentsOfFile: [urlString2 stringByExpandingTildeInPath]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
    [request setHTTPMethod:@"PUT"];
    [request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];

    NSMutableData *putData = [NSMutableData data];
    [request setHTTPBody:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
    NSData *jsonData = [parameter dataUsingEncoding:NSUTF8StringEncoding];
    [putData appendData:[NSData dataWithData:jsonData]];
    [putData appendData:[NSData dataWithData:file]];
    [request setHTTPBody:putData];


    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
        if([data length] >0 && error == nil){
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
            [SharableClass addLogForAPI:@"Profile Image Upload" withtimeStamp:[dateFormatter stringFromDate:[NSDate date]] message:@"API Success." withDelegate:delegate];
            __block NSError *error1;
            __block NSMutableDictionary *resultsDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error1];
            NSLog(@"Result Dictionary-: %@", resultsDictionary);
        }else if([data length] == 0 && error == nil){
            NSLog(@"There is no data.");
        }else if(error != nil){
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
            [SharableClass addLogForAPI:@"Profile Image Upload" withtimeStamp:[dateFormatter stringFromDate:[NSDate date]] message:@"API Failed." withDelegate:delegate];
            NSString * response = [NSString stringWithFormat:@"Result dictionary is-: %@", error];
            NSString *subStr = [SharableClass getSubsrtring:response betweenString:@"\""and:@"\""];
            NSLog(@"Error-: %@", subStr);
        }
    }];
});
}

我建議您使用AFNetworking框架,因為它可以簡化很多與您的網絡請求有關的內容。

更確切地說,它具有PUT方法:

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

編輯改用此方法(如在此答案中指定的https://stackoverflow.com/a/30388087/1420112 ):

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

NSError *error;
NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:@"http://example.com/rest/api/" parameters:@{@"foo" : @"bar"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    NSString *value = @"qux";
    NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
    [formData appendPartWithFormData:data name:@"baz"];
} error:&error];

NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (error) {
        NSLog(@"%@", error);
        return;
    }

    NSLog(@"%@", responseObject);
}];
[task resume];

在這里查看: https : //github.com/AFNetworking/AFNetworking

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM