2013-03-24 2 views
3

Я хочу сделать запрос POST с AFNetworking, который содержит параметры GET и POST.iOS AFNetworking GET/POST Параметры

Я использую этот код:

NSString *urlString = [NSString stringWithFormat:@"upload_stuff.php?userGUID=%@&clientGUID=%@", 
          @"1234", 
          [[UIDevice currentDevice] identifierForVendor].UUIDString]; 

    NSString *newUrl = @"https://sub.domain.com"; 

    NSURL *baseURL = [NSURL URLWithString:newUrl]; 

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; 
    [httpClient defaultValueForHeader:@"Accept"]; 

    NSDictionary *getParams = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"1234", @"userGUID", 
          [[UIDevice currentDevice] identifierForVendor].UUIDString, @"clientGUID", 
          nil]; 
    NSDictionary *postParams = [NSDictionary dictionaryWithObjectsAndKeys: 
           [@"xyz" dataUsingEncoding:NSUTF8StringEncoding], @"FILE", 
           nil]; 

    [httpClient postPath:urlString parameters:postParams success:^(AFHTTPRequestOperation *operation, id responseObject) { 


    }failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error retrieving data: %@", error); 
    }]; 

Теперь у меня есть два вопроса:

  • Как я могу использовать ОБА GET и POST словари в одном запросе? В течение времени я интегрирую словарь GET в URL-адрес и использую только словарь POST ([httpClient postPath:...])

  • Я получаю сообщение об ошибке с сервера, в котором указано, что отсутствует параметр «ФАЙЛ». К сожалению, я не могу проверить журналы сервера (не мой сервер). Но используя стандарт NSURLConnection, я смог отправить запросы с параметром FILE на этот сервер. Так что здесь происходит не так?

+0

Afnetworking имеет свой собственный метод отправки файла – Horst

+0

Можете ли вы дать какой-либо код? –

ответ

0

Stackoverflow для вас:

NSData* sendData = [self.fileName.text dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *sendDictionary = [NSDictionary dictionaryWithObject:sendData forKey:@"name"]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:remoteUrl]; 
NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST" 
                     path:@"/photos" 
                   parameters:sendDictionary 
                constructingBodyWithBlock:^(id <AFMultipartFormData>formData) 
            {          
             [formData appendPartWithFileData:photoImageData 
                    name:self.fileName.text 
                   fileName:filePath 
                   mimeType:@"image/jpeg"]; 
            } 
            ]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest]; 
[operation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 

    NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); 

}]; 

[operation setCompletionBlock:^{ 
    NSLog(@"%@", operation.responseString); //Gives a very scary warning 
}]; 

[operation start]; 

По @Igor Федорчук из POST jpeg upload with AFNetworking

+0

Ответ не имеет отношения к аргументам get. Он растратил мою жизнь. – OpenThread

+1

На самом деле, я не думаю, что метод GET может отправить файл напрямую. Если я ошибаюсь, plz скажите мне. Этот ленивый ответ отправлен как запрос пользователя @ user1423640. Это не ответ на метод GET. Если вы действительно хотите отправить его методом GET, измените изображение на base64 и отправьте его. (Обратите внимание на ограниченную длину) – Horst

0

AFNetworking не имеет метод для установки как GET и POST Params. Вам нужно настроить параметры GET на ваш URL-адрес и использовать настройки POST-параметров [AFHTTPClient requestWithMethod:path:parameters:].

- (NSURLRequest *)requestForPath:(NSString *)path method:(NSString *)method 
{ 
    NSMutableString *pathWithGetParams = [NSMutableString stringWithString:path]; 
    BOOL hasPathContainsQueryChar = [path rangeOfString:@"?"].location != NSNotFound; 
    [pathWithGetParams appendString:hasPathContainsQueryChar ? @"&" : @"?"]; 
    for (id key in self.getArguments.allKeys) 
    { 
     if ([key isKindOfClass:[NSString class]]) 
     { 
      NSString *value = self.getArguments[key]; 
      if ([value isKindOfClass:[NSString class]]) 
      { 
       [pathWithGetParams appendString:[[self class] urlEncode:key]]; 
       [pathWithGetParams appendString:@"="]; 
       [pathWithGetParams appendString:[[self class] urlEncode:value]]; 
       [pathWithGetParams appendString:@"&"]; 
      } 
     } 
    } 

    NSString *upperCaseMethod = [method uppercaseString]; 
    BOOL isMethodInGet = [upperCaseMethod isEqualToString:@"GET"]; 
    NSURLRequest *request = [[self shareAFClient] requestWithMethod:method 
                   path:pathWithGetParams 
                 parameters:isMethodInGet ? nil : self.postArguments]; 
    return request; 
} 

+ (NSString *)urlEncode:(NSString *)stringToEncode 
{ 
    return [self urlEncode:stringToEncode usingEncoding:NSUTF8StringEncoding]; 
} 

+ (NSString *)urlEncode:(NSString *)stringToEncode usingEncoding:(NSStringEncoding)encoding 
{ 
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, 
                       (__bridge CFStringRef)stringToEncode, 
                       NULL, 
                       (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                       CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

+ (NSString*)urlDecode:(NSString *)stringToDecode 
{ 
    return [self urlDecode:stringToDecode usingEncoding:NSUTF8StringEncoding]; 
} 

+ (NSString*)urlDecode:(NSString *)stringToDecode usingEncoding:(NSStringEncoding)encoding 
{ 
    return (__bridge_transfer NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, 
                            (__bridge CFStringRef)stringToDecode, 
                            (CFStringRef)@"", 
                            CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 
Смежные вопросы