2012-04-24 7 views
1

で同様のコードを使用しているとき、それは私のユーティリティクラスで、私はというメソッドを持って、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]; 
    } 
} 

私はこのすべてが理にかなって願っています。 :)

+0

画像をパラメータに入れて1つの方法しか使用しないのはなぜですか? – ggfela

+0

の "content-disposition"ビットが少し違っていて、コードが少し醜いと思ったからです。私はすでにそれを解決しましたが、議論の基盤として私のコードをもっと使いたいと思っていました。 – nevva

+0

私は個人的にはNSDataとしてボディを提供する必要があるメソッドを作成します。 – ggfela

答えて

1

は、単にリクエストオブジェクトを作る二つの方法ではなく、実際の接続の作成:最初のメソッド呼び出し内

(NSMutableURLRequest*)makeConnectionWithParameters:(NSMutableDictionary*)parameters; 
(NSMutableURLRequest*)makeConnectionWithParameters:(NSMutableDictionary*)parameters andImages(NSArray*)images; 

[self makeConnectionWithParameters:parameters andImages:nil]; 

を...とのためにnilのチェックを持っています第2の方法の中の画像。それらの2つのメソッドを使用して要求を取得し、返されたオブジェクトでNSURLConnectionを作成します。

+0

です。あなたは勝つ。 :) – nevva

関連する問題