2013-03-24 67 views
3

我想用AFNetworking做一个包含GET和POST参数的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:...]

  • 我收到服务器错误,指出参数“FILE”丢失。不幸的是,我无法检查任何服务器日志(不是我的服务器)。但使用标准NSURLConnection我能够发送请求与FILE参数到此服务器。那么这里出了什么问题?

+0

Afnetworking有自己的发送文件的方法 – Horst 2013-03-25 03:32:03

+0

你可以给任何代码吗? – 2013-03-25 11:19:25

回答

0

#2你:

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 Fedorchuk从POST jpeg upload with AFNetworking

+0

答案与获取参数没有任何关系。它浪费了我的生命。 – OpenThread 2013-11-05 03:32:48

+1

其实,我不认为GET方法可以直接发送文件。如果我错了,请告诉我。 这个懒惰的答案发布为@ user1423640的请求。这不是GET方法的答案。 如果您确实想通过GET方法发送它,请将图像更改为base64并发送。 (注意有限的长度) – Horst 2013-11-10 16:16:58

0

AFNetworking有没有方法来设置GET和POST PARAMS。 你必须设置GET PARAMS到你的网址,并使用[AFHTTPClient requestWithMethod:path:parameters:]设置POST PARAMS。

- (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)); 
}