で同様のコードを使用しているとき、それは私のユーティリティクラスで、私はというメソッドを持って、POST HTTPリクエストを使用して通信:ベストプラクティス私はAPIとcomunicateするためのユーティリティメソッドを持つメソッド
(void)makeConnectionWithParameters:(NSMutableDictionary*)parameters;
ウィッヒがかかりますパラメータを設定し、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];
}
}
私はこのすべてが理にかなって願っています。 :)
画像をパラメータに入れて1つの方法しか使用しないのはなぜですか? – ggfela
の "content-disposition"ビットが少し違っていて、コードが少し醜いと思ったからです。私はすでにそれを解決しましたが、議論の基盤として私のコードをもっと使いたいと思っていました。 – nevva
私は個人的にはNSDataとしてボディを提供する必要があるメソッドを作成します。 – ggfela