¿Cómo hacer POST NSURLRequest con 2 parámetros?

Quiero agregar 2 parámetros a NSURLRequest . ¿Hay alguna forma o debería usar AFnetworking?

Probablemente sea más fácil hacerlo si usa AFNetworking. Si tiene algún deseo de hacerlo usted mismo, puede usar NSURLSession , pero debe escribir más código.

  1. Si utiliza AFNetworking, se ocupa de todos estos detalles sangrientos de serializar la solicitud, diferenciando entre éxito y errores, etc.

     NSDictionary *params = @{@"firstname": @"John", @"lastname": @"Doe"}; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager POST:urlString parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"responseObject = %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error = %@", error); }]; 

    Esto supone que la respuesta del servidor es JSON. Si no (por ejemplo, texto plano o HTML), puede preceder al POST con:

     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
  2. Si lo haces tú mismo con NSURLSession , puedes construir la solicitud como NSURLSession :

     NSDictionary *params = @{@"firstname": @"John", @"lastname": @"Doe"}; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[self httpBodyForParameters:params]]; 

    Ahora puede iniciar la solicitud con NSURLSession . Por ejemplo, puede hacer:

     NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"dataTaskWithRequest error: %@", error); } if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if (statusCode != 200) { NSLog(@"Expected responseCode == 200; received %ld", (long)statusCode); } } // If response was JSON (hopefully you designed web service that returns JSON!), // you might parse it like so: // // NSError *parseError; // id responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; // if (!responseObject) { // NSLog(@"JSON parse error: %@", parseError); // } else { // NSLog(@"responseObject = %@", responseObject); // } // if response was text/html, you might convert it to a string like so: // // NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // NSLog(@"responseString = %@", responseString); }]; [task resume]; 

    Dónde

     /** Build the body of a `application/x-www-form-urlencoded` request from a dictionary of keys and string values @param parameters The dictionary of parameters. @return The `application/x-www-form-urlencoded` body of the form `key1=value1&key2=value2` */ - (NSData *)httpBodyForParameters:(NSDictionary *)parameters { NSMutableArray *parameterArray = [NSMutableArray array]; [parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) { NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], [self percentEscapeString:obj]]; [parameterArray addObject:param]; }]; NSString *string = [parameterArray componentsJoinedByString:@"&"]; return [string dataUsingEncoding:NSUTF8StringEncoding]; } 

    y

     /** Percent escapes values to be added to a URL query as specified in RFC 3986. See http://www.ietf.org/rfc/rfc3986.txt @param string The string to be escaped. @return The escaped string. */ - (NSString *)percentEscapeString:(NSString *)string { NSCharacterSet *allowed = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"]; return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed]; } 
 NSDictionary *params = @{@"firstname": @"John", @"lastname": @"Doe"}; NSMutableString *str = [NSMutableString stringWithString:@"http://yoururl.com/postname?"]; NSArray *keys = [params allKeys]; NSInteger counter = 0; for (NSString *key in keys) { [str appendString:key]; [str appendString:@"="]; [str appendString:params[key]]; if (++counter < keys.count) { // more params to come... [str appendString:@"&"]; } } NSURL *url = [NSURL URLWithString:str]; // should give you: http://yoururl.com/postname?firstname=John&lastname=Doe // not tested, though