Enviar una solicitud HTTP POST en iOS

Intento enviar una publicación HTTP con la aplicación iOS que estoy desarrollando, pero la inserción nunca llega al servidor, aunque obtengo un código 200 como respuesta (desde urlconnection). Nunca recibo una respuesta del servidor ni el servidor detecta mis publicaciones (el servidor detecta las publicaciones provenientes de Android)

Utilizo ARC pero he establecido pd y urlConnection como fuertes.

Este es mi código para enviar la solicitud

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]]; [request setHTTPMethod:@"POST"]; [request setValue:@"text/xml" forHTTPHeaderField:@"Content-type"]; NSString *sendString = @"Item 1Item 2"; [request setValue:[NSString stringWithFormat:@"%d", [sendString length]] forHTTPHeaderField:@"Content-length"]; [request setHTTPBody:[sendString dataUsingEncoding:NSUTF8StringEncoding]]; PushDelegate *pushd = [[PushDelegate alloc] init]; pd = pushd; urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:pd]; [urlConnection start]; 

este es mi código para el delegado

 #import "PushDelegate.h" @implementation PushDelegate @synthesize data; -(id) init { if(self = [super init]) { data = [[NSMutableData alloc]init]; [data setLength:0]; } return self; } - (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten { NSLog(@"didwriteData push"); } - (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes { NSLog(@"connectionDidResumeDownloading push"); } - (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL { NSLog(@"didfinish push @push %@",data); } - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { NSLog(@"did send body"); } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [self.data setLength:0]; NSHTTPURLResponse *resp= (NSHTTPURLResponse *) response; NSLog(@"got response with status @push %d",[resp statusCode]); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d { [self.data appendData:d]; NSLog(@"recieved data @push %@", data); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]; NSLog(@"didfinishLoading%@",responseText); } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error ", @"") message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles:nil] show]; NSLog(@"failed &push"); } // Handle basic authentication challenge if needed - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { NSLog(@"credentials requested"); NSString *username = @"username"; NSString *password = @"password"; NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]; [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; } @end 

La consola siempre imprime las siguientes líneas y las siguientes líneas solamente:

 2013-04-01 20:35:04.341 ApprenticeXM[3423:907] did send body 2013-04-01 20:35:04.481 ApprenticeXM[3423:907] got response with status @push 200 2013-04-01 20:35:04.484 ApprenticeXM[3423:907] didfinish push @push  

El siguiente código describe un ejemplo simple usando el método POST . ( Cómo uno puede pasar datos por el método POST )

Aquí, describo cómo se puede usar el método POST.

1. Establecer cadena de publicación con nombre de usuario y contraseña reales.

 NSString *post = [NSString stringWithFormat:@"Username=%@&Password=%@",@"username",@"password"]; 

2. Codifique la cadena de publicaciones utilizando NSASCIIStringEncoding y también la cadena de publicaciones que debe enviar en formato NSData.

 NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

Debe enviar la longitud real de sus datos. Calcule la longitud de la cadena de publicaciones.

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

3. Cree una Urlrequest con todas las propiedades, como el método HTTP , el campo del encabezado http con la longitud de la cadena de publicaciones. Crea el objeto URLRequest e inícialízalo.

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

Establezca la URL a la que va a enviar los datos a esa solicitud.

 [request setURL:[NSURL URLWithString:@"http://www.abcde.com/xyz/login.aspx"]]; 

Ahora, configure el método HTTP ( POST o GET ). Escribe estas líneas tal como están en tu código.

 [request setHTTPMethod:@"POST"]; 

Establezca el campo del encabezado HTTP con la longitud de los datos de la publicación.

 [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

Establezca también el valor Codificado para el campo del encabezado HTTP.

 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

Establezca el HTTPBody de la urlrequest con postData.

 [request setHTTPBody:postData]; 

4. Ahora, crea el objeto URLConnection. Inicialízalo con la URLRequest.

 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Devuelve la conexión de URL inicializada y comienza a cargar los datos para la solicitud de url. Puede verificar si la conexión URL se realiza correctamente o no utilizando solo la instrucción if / else como se muestra a continuación.

 if(conn) { NSLog(@"Connection Successful"); } else { NSLog(@"Connection could not be made"); } 

5. Para recibir los datos de la solicitud HTTP, puede usar los métodos de delegado provistos por la Referencia de clase de URLConnection. Los métodos de delegado son los siguientes.

 // This method is used to receive the data which we get using post method. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data // This method receives the error report in case of connection is not made to server. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error // This method is used to process the data after connection has made successfully. - (void)connectionDidFinishLoading:(NSURLConnection *)connection 

También consulte esto y esta documentación para el método POST .

Y aquí está el mejor ejemplo con el código fuente del método HTTPPost.

No estoy muy seguro de por qué, pero tan pronto como comente el siguiente método, funciona:

 connectionDidFinishDownloading:destinationURL: 

Además, no creo que necesite los métodos del protocolo NSUrlConnectionDownloadDelegate, solo los de NSURLConnectionDataDelegate, a menos que desee descargar información.

Aquí está el método que utilicé en mi biblioteca de registro: https://github.com/goktugyil/QorumLogs

Este método rellena formularios html dentro de Google Forms. Espero que ayude a alguien usando Swift.

 var url = NSURL(string: urlstring) var request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "POST" request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type") request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding) var connection = NSURLConnection(request: request, delegate: nil, startImmediately: true) 
 -(void)sendingAnHTTPPOSTRequestOniOSWithUserEmailId: (NSString *)emailId withPassword: (NSString *)password{ //Init the NSURLSession with a configuration NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; //Create an URLRequest NSURL *url = [NSURL URLWithString:@"http://www.example.com/apis/login_api"]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; //Create POST Params and add it to HTTPBody NSString *params = [NSString stringWithFormat:@"email=%@&password=%@",emailId,password]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; //Create task NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { //Handle your response here NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@",responseDict); }]; [dataTask resume]; } 

** Publicar API con parámetros y validar con url para navegar si la clave de respuesta json con estado: “éxito”

 NSString *string= [NSString stringWithFormat:@"url?uname=%@&pass=%@&uname_submit=Login",self.txtUsername.text,self.txtPassword.text]; NSLog(@"%@",string); NSURL *url = [NSURL URLWithString:string]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; NSURLResponse *response; NSError *err; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; NSLog(@"responseData: %@", responseData); NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"responseData: %@", str); NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil]; NSDictionary* latestLoans = [json objectForKey:@"status"]; NSString *str2=[NSString stringWithFormat:@"%@", latestLoans]; NSString *str3=@"success"; if ([str3 isEqualToString:str2 ]) { [self performSegueWithIdentifier:@"move" sender:nil]; NSLog(@"successfully."); } else { UIAlertController *alert= [UIAlertController alertControllerWithTitle:@"Try Again" message:@"Username or Password is Incorrect." preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){ [self.view endEditing:YES]; } ]; [alert addAction:ok]; [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor redColor]]; [self presentViewController:alert animated:YES completion:nil]; [self.view endEditing:YES]; } 

Respuesta JSON : {“estado”: “éxito”, “usuario_id”: “58”, “nombre_usuario”: “dilip”, “resultado”: “Ha iniciado sesión correctamente”} Código de trabajo

**

Enviar una solicitud HTTP POST en iOS (Objetivo c):

 -(NSString *)postexample{ // SEND POST NSString *url = [NSString stringWithFormat:@"URL"]; NSString *post = [NSString stringWithFormat:@"param=value"]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPMethod:@"POST"]; [request setURL:[NSURL URLWithString:url]]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSError *error = nil; NSHTTPURLResponse *responseCode = nil; //RESPONDE DATA NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]; if([responseCode statusCode] != 200){ NSLog(@"Error getting %@, HTTP status code %li", url, (long)[responseCode statusCode]); return nil; } //SEE RESPONSE DATA UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Response" message:[[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [alert show]; return [[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding]; } 

Con Swift 3 o 4 puede acceder a esta solicitud http para cortar la comunicación.

// Para datos POST para solicitar

  func postAction() { //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid let parameters = ["id": 13, "name": "jack"] as [String : Any] //create the url with URL let url = URL(string: "www.requestURL.php")! //change the url //create the session object let session = URLSession.shared //now create the URLRequest object using the url object var request = URLRequest(url: url) request.httpMethod = "POST" //set http method as POST do { request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body } catch let error { print(error.localizedDescription) } request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") //create dataTask using the session object to send data to the server let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in guard error == nil else { return } guard let data = data else { return } do { //create json object from data if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { print(json) // handle json... } } catch let error { print(error.localizedDescription) } }) task.resume() } 

// Para obtener los datos de la solicitud

 func GetRequest() { let urlString = URL(string: "http://www.requestURL.php") //change the url if let url = urlString { let task = URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error ?? "") } else { if let responceData = data { print(responceData) //JSONSerialization do { //create json object from data if let json = try JSONSerialization.jsonObject(with:responceData, options: .mutableContainers) as? [String: Any] { print(json) // handle json... } } catch let error { print(error.localizedDescription) } } } } task.resume() } } 

// Para obtener el contenido de descarga como imagen o video de solicitud

 func downloadTask() { // Create destination URL let documentsUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL! let destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.jpg") //Create URL to the source file you want to download let fileURL = URL(string: "http://placehold.it/120x120&text=image1") let sessionConfig = URLSessionConfiguration.default let session = URLSession(configuration: sessionConfig) let request = URLRequest(url:fileURL!) let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in if let tempLocalUrl = tempLocalUrl, error == nil { // Success if let statusCode = (response as? HTTPURLResponse)?.statusCode { print("Successfully downloaded. Status code: \(statusCode)") } do { try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl) } catch (let writeError) { print("Error creating a file \(destinationFileUrl) : \(writeError)") } } else { print("Error took place while downloading a file. Error description: %@", error?.localizedDescription ?? ""); } } task.resume() }