2011-08-25 5 views
3

Je suis très travaille lentement mon chemin à travers l'apprentissage de l'URL système de chargement pour le développement iOS, et j'espère que quelqu'un pourrait expliquer brièvement le morceau de code suivant:Objectif C - données POST en utilisant NSURLConnection

NSString *myParameters = [[NSString alloc] initWithFormat:@"one=two&three=four"]; 
[myRequest setHTTPMethod:@"POST"]; 
[myRequest setHTTPBody:[myParameters dataUsingEncoding:NSUTF8StringEncoding]]; 

Finalement, J'aimerais pouvoir créer une application qui se connecte au site Web de mon FAI et récupère la quantité de données qu'il me reste pour le reste du mois, et je pense que je devrais commencer par définir setHTTPMethod/setHTTPBody en premier.

Amitiés

Répondre

14

Il s'agit d'une configuration de requête HTTP assez simple; Si vous avez des questions plus spécifiques, vous feriez mieux de les poser.

NSString *myParameters = @"paramOne=valueOne&paramTwo=valueTwo"; 

Ceci définit une chaîne contenant les paramètres POST. La demande doit être POST request.

[myRequest setHTTPBody:[myParameters dataUsingEncoding:NSUTF8StringEncoding]]; 

Cela met les paramètres dans le corps de poste (ils doivent être données brutes, donc nous avons d'abord les encoder en UTF-8).

+0

Merci pour votre réponse. À titre de suivi, si j'écris une application qui se connecte à un site Web à l'aide d'un nom d'utilisateur et d'un mot de passe, comment accèderais-je aux données de la page qui apparaîtraient habituellement après avoir entré ces données? plutôt que la page de connexion)? Est-ce aussi simple que d'utiliser le NSURLRequest pour établir un NSURLConnection, puis télécharger les données? – achiral

+0

Il y a plusieurs façons. Vous pouvez placer l'information dans [NSURLCredentialStorage] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLCredentialStorage_Class/Reference/Reference.html), la fournir dans le cadre de URL, ou utilisez la méthode déléguée NSURLConnection 'connection: didReceiveAuthenticationChallenge:'. Je vous encourage fortement à consulter le [Guide de programmation du système de chargement d'URL] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/ 10000165i). – jtbandes

1

La première ligne a créé une chaîne, il peut être remplacé par:

NSString *myParameters = @"one=two&three=four"; 

Il est écrit dans initWithFormat de sorte que vous pouvez l'étendre à attribuer une valeur de paramètre.

La deuxième ligne indique qu'il s'agit d'une demande de publication HTTP. La troisième ligne, méthode setHTTPBody, prend le type NSData. Vous devez donc convertir le type de chaîne en NSData à l'aide de la méthode dataUsingEncoding.

7
Step 1 : set URL definitions: 

// Create the request 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.0.232:8080/xxxx/api/Login"]]; 

    // Specify that it will be a POST request 
    request.HTTPMethod = @"POST"; 

    // This is how we set header fields 
    [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 

    NSMutableDictionary *postDict = [[NSMutableDictionary alloc] init]; 

    [postDict setValue:@"Login" forKey:@"methodName"]; 
    [postDict setValue:@"admin" forKey:@"username"]; 
    [postDict setValue:@"123456" forKey:@"password"]; 
    [postDict setValue:@"mobile" forKey:@"clientType"]; 


    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postDict options:0 error:nil]; 

    // Checking the format 
    NSString *urlString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 


    // Convert your data and set your request's HTTPBody property 
    NSString *stringData = [[NSString alloc] initWithFormat:@"jsonRequest=%@", urlString]; 

    //@"jsonRequest={\"methodName\":\"Login\",\"username\":\"admin\",\"password\":\"12345678n\",\"clientType\":\"web\"}"; 

    NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding]; 

    request.HTTPBody = requestBodyData; 

    // Create url connection and fire request 
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (!theConnection) { 

     // Release the receivedData object. 
     NSMutableData *responseData = nil; 

     // Inform the user that the connection failed. 
    } 

Step 2: 

// Declare the value for NSURLResponse URL 

//pragma mark NSURLConnection Delegate Methods 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    // A response has been received, this is where we initialize the instance var you created 
    // so that we can append data to it in the didReceiveData method 
    // Furthermore, this method is called each time there is a redirect so reinitializing it 
    // also serves to clear it 
    _responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data to the instance variable you declared 
    [_responseData appendData:data]; 

    NSError *error=nil; 

    // Convert JSON Object into Dictionary 
    NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:_responseData options: 
          NSJSONReadingMutableContainers error:&error]; 



    NSLog(@"Response %@",JSON); 
} 

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection 
        willCacheResponse:(NSCachedURLResponse*)cachedResponse { 
    // Return nil to indicate not necessary to store a cached response for this connection 
    return nil; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // The request is complete and data has been received 
    // You can parse the stuff in your instance variable now 

} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // The request has failed for some reason! 
    // Check the error var 
} 
+0

Voici la réponse qui montre comment utiliser NSURLConnection le plus complètement. – helsont

0
please use below code. 
+(void)callapi:(NSString *)str withBlock:(dictionary)block{ 

NSData *postData = [str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; 

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@“%@/url”,WebserviceUrl]] 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:120.0]; 

[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[urlRequest setHTTPBody:postData]; 

[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
{ 
    if (!data) { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
      [dict setObject:[NSString stringWithFormat:@"%@",AMLocalizedString(SomethingWentWrong, nil)] forKey:@"error"]; 
     block(dict); 
     return ; 
    } 
    NSError *error = nil; 
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; 
    //////NSLog(@"%@",dict); 
    if (!dict) { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
     [dict setObject:AMLocalizedString(ServerResponceError, nil) forKey:@"error"]; 
     block(dict); 
     return ; 
    } 
    block(dict); 

}]; 
} 
+0

Le "s'il vous plaît essayer ci-dessous le code." phrase ne devrait pas être dans le bloc de code. En outre, veuillez expliquer ce que vous faites dans le code afin que les personnes qui découvrent la langue aient une chance de comprendre et d'utiliser votre code. – Wndrr

Questions connexes