【发布时间】:2012-04-24 08:51:47
【问题描述】:
我有一个实用程序方法来与 API 通信,它使用 POST HTTP 请求进行通信,在我的实用程序类中我有一个方法称为:
(void)makeConnectionWithParameters:(NSMutableDictionary*)parameters;
wich 获取参数并设置 POST 的正文。但是,在一种特殊情况下,我想上传一些图像并且代码稍作更改以使上传所述图像成为可能,这种情况下的最佳做法是什么?我应该将方法重命名为:
(void)makeConnectionWithParameters:(NSMutableDictionary*)parameters andImages(NSArray*)images;
并在所有其他情况下将 nil 设置为参数,或者我应该在调用“makeConnectionWithParameters”的方法中设置一个布尔值并检查该方法是否设置了布尔值并在这种情况下处理图像?
还有什么让代码更漂亮的想法吗?
方法如下:
(void)makeConnectionWithParameters:(NSMutableDictionary*)parameters
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURL *url = [NSURL URLWithString:BASE_URL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20];
request.HTTPMethod = @"POST";
NSString *boundary = @"myR4ND0Mboundary";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];
//Lägg till inloggningsuppgifter för API-anropet
[parameters setValue:API_LOGIN forKey:@"api-login"];
[parameters setValue:API_PASSWORD forKey:@"api-password"];
//Lägg till alla parameterar i POST-bodyn
NSMutableData *body = [NSMutableData data];
for (NSString *param in parameters)
{
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", [parameters objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}
if(hasImages)
{
int c = 0;
for(UIImage* image in self.images)
{
c++;
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
if (imageData)
{
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", [NSString stringWithFormat:@"image%d", c]] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
imageData = nil;
}
}
//Sätt content-length
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:body];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if(connection)
{
receivedData = [NSMutableData dataWithLength:0];
}
}
我希望这一切都有意义。 :)
【问题讨论】:
-
为什么不把图片放在参数里,只用一种方法呢?
-
因为“内容处置”位有点不同,我认为代码有点难看。我已经解决了,但我想更多地使用我的代码作为讨论的基础。
-
我个人会制定一个方法,您需要将正文作为 NSData 提供。
-
是的,这可行,然后可以使用两种不同的方法将数据附加到正文。一种具有正常参数,另一种使用图像。