2010-08-25 15 views
51

Tengo una página web php que requiere un inicio de sesión (contraseña de usuario &). El usuario ingresó la información en la aplicación, muy bien ... pero necesito un ejemplo sobre cómo hacer una solicitud POST a un sitio web. El ejemplo de Apple en el sitio de soporte es bastante complicado y muestra una carga de imágenes ... el mío debería ser más simple. Solo quiero publicar 2 líneas de texto ... ¿Alguien tiene algún buen ejemplo?Ejemplo simple de http en Objective-C?

Alex

Respuesta

113

¿Qué tal

NSString *post = @"key1=val1&key2=val2"; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:@"http://www.nowhere.com/sendFormHere.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

Tomado de http://deusty.blogspot.com/2006/11/sending-http-get-and-post-from-cocoa.html. Eso es lo que utilicé recientemente, y funcionó bien para mí.

Por cierto, 5 segundos de googlear le he dejado al mismo resultado, el uso de los términos "solicitud de cacao post");

+0

Gracias ... Daré una oportunidad ... Busqué en Google para "xcode http post" y "xcode html post" sin mucha suerte :) ¡Gracias! –

+8

Eso es porque, como ya dijo vikingosekundo, xcode no tiene nada que ver con eso, es solo el IDE que está usando. Estás programando en Objective-C, usando el marco de Cocoa. – fresskoma

+1

@Alex: Eres nuevo en StackOverflow. "Gracias" debe ser expresado por un voto positivo – vikingosegundo

12

ASIHTTPRequest hace que la comunicación de red muy fácil

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request addPostValue:@"Ben" forKey:@"names"]; 
[request addPostValue:@"George" forKey:@"names"]; 
[request addFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photos"]; 
[request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"]; 
+8

Ha sido descontinuado desde entonces: http://allseeing-i.com/[request_release]; –

+0

@SagarHatekar Sé – vikingosegundo

+1

Debido a ';' en la babosa, su enlace no está funcionando. intente http://allseeing-i.com/%5Brequest_release%5D – vikingosegundo

13

From Apple's Official Website:

// In body data for the 'application/x-www-form-urlencoded' content type, 
// form fields are separated by an ampersand. Note the absence of a 
// leading ampersand. 
NSString *bodyData = @"name=Jane+Doe&address=123+Main+St"; 

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.apple.com"]]; 

// Set the request's content type to application/x-www-form-urlencoded 
[postRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

// Designate the request a POST request and specify its body data 
[postRequest setHTTPMethod:@"POST"]; 
[postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]]; 

// Initialize the NSURLConnection and proceed as described in 
// Retrieving the Contents of a URL 

Desde: code with chris

// Create the request. 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 

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

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

// Convert your data and set your request's HTTPBody property 
NSString *stringData = @"some data"; 
NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding]; 
request.HTTPBody = requestBodyData; 

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

Soy un principiante en aplicaciones de iPhone y todavía tengo problemas, aunque seguí los consejos anteriores. Parece que las variables post no son recibidos por mi servidor - no está seguro de si se trata de php o código Objective-C ...

la parte Objective-C (codificado siguiendo Chris' methodo protocolo)

// Create the request. 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.php"]]; 

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

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

// Convert your data and set your request's HTTPBody property 
NSString *stringData = [NSString stringWithFormat:@"user_name=%@&password=%@", self.userNameField.text , self.passwordTextField.text]; 
NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding]; 
request.HTTPBody = requestBodyData; 

// Create url connection and fire request 
//NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
NSData *response = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:nil error:nil]; 

NSLog(@"Response: %@",[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]); 

por debajo de la parte php:

if (isset($_POST['user_name'],$_POST['password'])) 

{ 

// Create connection 
$con2=mysqli_connect($servername, $username, $password, $dbname); 
if (mysqli_connect_errno()) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
else 
{ 
// retrieve POST vars 
$username = $_POST['user_name']; 
$password = $_POST['password']; 

$sql = "INSERT INTO myTable (user_name, password) VALUES ('$username', '$password')"; 
$retval = mysqli_query($sql, $con2); 
if(! $retval) 
{ 
die('Could not enter data: ' . mysql_error()); 
} 
echo "Entered data successfully\n"; 

mysqli_close($con2); 

} 
} 
else 
{ 
echo "No data input in php"; 
} 

me han pegado los últimos días en este caso.

4

Se puede hacer uso de dos opciones:

Uso NSURLConnection:

NSURL* URL = [NSURL URLWithString:@"http://www.example.com/path"]; 
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; 
request.HTTPMethod = @"POST"; 
// Form URL-Encoded Body 

NSDictionary* bodyParameters = @{ 
    @"username": @"reallyrambody", 
    @"password": @"123456" 
}; 
request.HTTPBody = [NSStringFromQueryParameters(bodyParameters) dataUsingEncoding:NSUTF8StringEncoding]; 

// Connection 

NSURLConnection* connection = [NSURLConnection connectionWithRequest:request delegate:nil]; 
[connection start]; 

/* 
* Utils: Add this section before your class implementation 
*/ 

/** 
This creates a new query parameters string from the given NSDictionary. For 
example, if the input is @{@"day":@"Tuesday", @"month":@"January"}, the output 
string will be @"day=Tuesday&month=January". 
@param queryParameters The input dictionary. 
@return The created parameters string. 
*/ 
static NSString* NSStringFromQueryParameters(NSDictionary* queryParameters) 
{ 
    NSMutableArray* parts = [NSMutableArray array]; 
    [queryParameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
     NSString *part = [NSString stringWithFormat: @"%@=%@", 
      [key stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding], 
      [value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding] 
     ]; 
     [parts addObject:part]; 
    }]; 
    return [parts componentsJoinedByString: @"&"]; 
} 

/** 
Creates a new URL by adding the given query parameters. 
@param URL The input URL. 
@param queryParameters The query parameter dictionary to add. 
@return A new NSURL. 
*/ 
static NSURL* NSURLByAppendingQueryParameters(NSURL* URL, NSDictionary* queryParameters) 
{ 
    NSString* URLString = [NSString stringWithFormat:@"%@?%@", 
     [URL absoluteString], 
     NSStringFromQueryParameters(queryParameters) 
    ]; 
    return [NSURL URLWithString:URLString]; 
} 

Uso NSURLSession

- (void)sendRequest:(id)sender 
{ 
    /* Configure session, choose between: 
     * defaultSessionConfiguration 
     * ephemeralSessionConfiguration 
     * backgroundSessionConfigurationWithIdentifier: 
    And set session-wide properties, such as: HTTPAdditionalHeaders, 
    HTTPCookieAcceptPolicy, requestCachePolicy or timeoutIntervalForRequest. 
    */ 
    NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    /* Create session, and optionally set a NSURLSessionDelegate. */ 
    NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil]; 

    /* Create the Request: 
     Token Duplicate (POST http://www.example.com/path) 
    */ 

    NSURL* URL = [NSURL URLWithString:@"http://www.example.com/path"]; 
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; 
    request.HTTPMethod = @"POST"; 

    // Form URL-Encoded Body 

    NSDictionary* bodyParameters = @{ 
     @"username": @"reallyram", 
     @"password": @"123456" 
    }; 
    request.HTTPBody = [NSStringFromQueryParameters(bodyParameters) dataUsingEncoding:NSUTF8StringEncoding]; 

    /* Start a new Task */ 
    NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     if (error == nil) { 
      // Success 
      NSLog(@"URL Session Task Succeeded: HTTP %ld", ((NSHTTPURLResponse*)response).statusCode); 
     } 
     else { 
      // Failure 
      NSLog(@"URL Session Task Failed: %@", [error localizedDescription]); 
     } 
    }]; 
    [task resume]; 
} 

/* 
* Utils: Add this section before your class implementation 
*/ 

/** 
This creates a new query parameters string from the given NSDictionary. For 
example, if the input is @{@"day":@"Tuesday", @"month":@"January"}, the output 
string will be @"day=Tuesday&month=January". 
@param queryParameters The input dictionary. 
@return The created parameters string. 
*/ 
static NSString* NSStringFromQueryParameters(NSDictionary* queryParameters) 
{ 
    NSMutableArray* parts = [NSMutableArray array]; 
    [queryParameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
     NSString *part = [NSString stringWithFormat: @"%@=%@", 
      [key stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding], 
      [value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding] 
     ]; 
     [parts addObject:part]; 
    }]; 
    return [parts componentsJoinedByString: @"&"]; 
} 

/** 
Creates a new URL by adding the given query parameters. 
@param URL The input URL. 
@param queryParameters The query parameter dictionary to add. 
@return A new NSURL. 
*/ 
static NSURL* NSURLByAppendingQueryParameters(NSURL* URL, NSDictionary* queryParameters) 
{ 
    NSString* URLString = [NSString stringWithFormat:@"%@?%@", 
     [URL absoluteString], 
     NSStringFromQueryParameters(queryParameters) 
    ]; 
    return [NSURL URLWithString:URLString]; 
} 
+0

'La declaración implícita de función 'NSStringFromQueryParameters' no es válida en C99' –

+0

¿Puede sugerir una mejora para esto? –

0

Muchas gracias funcionó, tenga en cuenta que hice un error tipográfico en php, ya que debe ser mysqli_query ($ con2, $ sql)

2
NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init]; 
[contentDictionary setValue:@"name" forKey:@"email"]; 
[contentDictionary setValue:@"name" forKey:@"username"]; 
[contentDictionary setValue:@"name" forKey:@"password"]; 
[contentDictionary setValue:@"name" forKey:@"firstName"]; 
[contentDictionary setValue:@"name" forKey:@"lastName"]; 

NSData *data = [NSJSONSerialization dataWithJSONObject:contentDictionary options:NSJSONWritingPrettyPrinted error:nil]; 
NSString *jsonStr = [[NSString alloc] initWithData:data 
              encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",jsonStr); 

NSString *urlString = [NSString stringWithFormat:@"http://testgcride.com:8081/v1/users"]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 


[request setHTTPBody:[jsonStr dataUsingEncoding:NSUTF8StringEncoding]]; 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"moinsam" password:@"cheese"]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:<block> failure:<block>]; 
+0

Esto, en mi opinión, es mucho más limpio que las respuestas @ "% @ =% @ &% @ =% @ & ...". No estaba enterado de 'dataWithJSONObject', gracias. –

0

Aquí estoy agregando un código de muestra para la respuesta http post print y analizando como JSON, si es posible, manejará todo de manera asíncrona, por lo que su GUI se actualizará perfectamente y no se paralizará, lo que es importante notar.

//POST DATA 
NSString *theBody = [NSString stringWithFormat:@"parameter=%@",YOUR_VAR_HERE]; 
NSData *bodyData = [theBody dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
//URL CONFIG 
NSString *serverURL = @"https://your-website-here.com"; 
NSString *downloadUrl = [NSString stringWithFormat:@"%@/your-friendly-url-here/json",serverURL]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: downloadUrl]]; 
//POST DATA SETUP 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:bodyData]; 
//DEBUG MESSAGE 
NSLog(@"Trying to call ws %@",downloadUrl); 
//EXEC CALL 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    if (error) { 
     NSLog(@"Download Error:%@",error.description); 
    } 
    if (data) { 

     // 
     // THIS CODE IS FOR PRINTING THE RESPONSE 
     // 
     NSString *returnString = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]; 
     NSLog(@"Response:%@",returnString); 

     //PARSE JSON RESPONSE 
     NSDictionary *json_response = [NSJSONSerialization JSONObjectWithData:data 
                     options:0 
                     error:NULL]; 

     if (json_response) { 
      if ([json_response isKindOfClass:[NSDictionary class]]) { 
       // do dictionary things 
       for (NSString *key in [json_response allKeys]) { 
        NSLog(@"%@: %@", key, json_response[key]); 
       } 
      } 
      else if ([json_response isKindOfClass:[NSArray class]]) { 
       NSLog(@"%@",json_response); 
      } 
     } 
     else { 
      NSLog(@"Error serializing JSON: %@", error); 
      NSLog(@"RAW RESPONSE: %@",data); 
      NSString *returnString2 = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]; 
      NSLog(@"Response:%@",returnString2); 
     } 
    } 
}]; 

Hope this helps!