Simple post de http ejemplo en Objective-C?

He php de la página web que requiere un inicio de sesión (id de usuario & contraseña). Puedo hacer que el usuario introduzca la información en la aplicación de bellas.. pero necesito un ejemplo de cómo hacer una solicitud POST a un sitio web. El apple ejemplo en el sitio de soporte es bastante complicada, mostrando una imagen de carga.. mina debe ser más simple.. solo quiero post de 2 líneas de texto..
Alguien tiene alguna buena ejemplos?

Alex

InformationsquelleAutor Alex van Es | 2010-08-25

8 Kommentare

  1. 115

    Esto es lo que ha utilizado recientemente, y funcionó muy bien para mí:

    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];

    Originalmente tomado de http://deusty.blogspot.com/2006/11/sending-http-get-and-post-from-cocoa.html, pero que blog parece que no existe ya.

    • Gracias.. voy a dar que un tiro.. busqué en google para «xcode http post» y «xcode html post» sin mucha suerte 🙂 Gracias!
    • Eso es porque, como vikingosekundo ya se dijo, xcode no tiene nada con ella, solo la IDE está utilizando. La programación en Objective-C, usando el marco de Cacao.
    • Eres nuevo en StackOverflow. «Gracias» debe ser expresada por una upvote
    • 5 segundos de búsqueda en google llevó a esta página… gracias por responder que en lugar de decir «google». suficiente con el google los comentarios de la gente, geesh
    • En realidad 5 segundos de búsqueda en Google ahora conduce directamente a este MODO de respuesta.
    • ¿Cómo manejar si tu postData contiene un objeto?
    • +1 por el esfuerzo, pero no siempre, el trabajo de solo como que. Debe agregar un post = [post stringByAddingPercentEscapesUsingencoding:NSUTF8StringEncoding]; incluso si usted está usando llanura de caracteres ASCII. (como Naeem de abajo la tiene)

  2. 15

    Desde la Web Oficial de Apple :

    //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

    De : código con 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];
  3. 12

    ASIHTTPRequest hace que la comunicación de red realmente 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"];
    • Debido a ;en el slug, su enlace no funciona. trate de allseeing-i.com/%5Brequest_release%5D
    • hola, ¿cómo saber FormDataRequest se haya completado? es allí cualquier requestFinished método?
  4. 4

    Que usted puede hacer mediante dos opciones:

    Utilizando 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];
    }

    Utilizando 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];
    }
    • Implicit declaration of function 'NSStringFromQueryParameters' is invalid in C99
    • Puedes sugerir una mejora para esto?
  5. 2

    Soy un principiante en aplicaciones para el iPhone y todavía tengo un problema, aunque he seguido los anteriores consejos. Parece variables POST no son recibidos por mi servidor no seguro de si se trata de php o código objective-c …

    el objetivo-c (codificado siguientes Chris’ protocolo de methodo)

    //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 de php parte :

    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 el este.

  6. 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>];
    • Esto en mi opinión es mucho más limpio que el upvoted @»%@=%@&%@=%@&…» respuestas. No era consciente de dataWithJSONObject, gracias.
  7. 0

    Aquí estoy añadiendo código de ejemplo para http post de impresión de respuesta y el análisis de JSON si es posible, se ocupará de todo lo async por lo que su GUI será refrescante muy bien y no se congele en todo lo que es importante aviso.

    //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);
            }
        }
    }];

    Espero que esto ayude!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...