Sending HTTP POST request on iOS

I am trying to send an HTTP message with an iOS application that I am developing, but clicking never reaches the server, although I get 200 code as a response (from urlconnection). I never get a response from the server, and the server does not detect my messages (the server detects messages coming from android).

I use ARC, but set pd and urlConnection as strong.

This is my code to send a request

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]]; [request setHTTPMethod:@"POST"]; [request setValue:@"text/xml" forHTTPHeaderField:@"Content-type"]; NSString *sendString = @"<data><item>Item 1</item><item>Item 2</item></data>"; [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]; 

this is my delegate code

 #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 

The console always prints only the following lines and only the following lines:

 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 <> 
+83
ios objective-c automatic-ref-counting nsurlconnection
Apr 01
source share
7 answers

The following code describes a simple example using the POST method (how to transmit data using the POST method)

Here I describe how you can use the POST method.

1. Set a message string with the actual username and password.

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

2. Encode the message string using NSASCIIStringEncoding , as well as the message string that must be sent in NSData format.

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

You need to send the actual length of your data. Calculate the line length of the message.

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

3. Create an Urlrequest with all properties of type HTTP , an HTTP header field with a message line length. Create a URLRequest object and initialize it.

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

Set the Url for which you are going to send data to this request.

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

Now set the HTTP method (POST or GET). Write these lines as they are in your code.

 [request setHTTPMethod:@"POST"]; 

Set an HTTP header field with the message data length.

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

Also set the encoded value for the HTTP header.

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

Set HTTPBody urlrequest with postData.

 [request setHTTPBody:postData]; 

4. Now create the URLConnection object. Initialize it using URLRequest.

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

It returns an initialized url connection and starts loading data for the url request. You can check if the URL connection is correct or not using only the if / else statement as shown below.

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

5 .. To get data from an HTTP request, you can use the delegate methods provided by the URLConnection class reference. Delegate methods are given below.

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

Also see This and This is the documentation for the POST method.

And here is the best source code example of the HTTPPost method.

+186
Apr 01 '13 at 18:44
source

I'm not quite sure why, but as soon as I comment on the following method, it works:

 connectionDidFinishDownloading:destinationURL: 

In addition, I do not think that you need methods from the NSUrlConnectionDownloadDelegate protocol, only those from NSURLConnectionDataDelegate if you do not want to receive download information.

+2
Apr 01 '13 at 7:15
source

Here is the method I used in my registration library: https://github.com/goktugyil/QorumLogs

This method fills the html forms inside Google forms. Hope this helps someone using 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) 
+2
Sep 17 '15 at 13:18
source
 -(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]; } 
+2
Dec 08 '15 at 7:41
source

** Post API with parameters and check with url for navigation if json response key with status: "success"

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

JSON Response: {"status": "success", "user_id": "58", "user_name": "dilip", "result": "You have successfully logged in"} Work code

**

+1
Jan 14 '17 at 6:36
source

Sending an HTTP POST request on iOS (Objective 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]; } 
+1
Nov 24 '17 at 13:57
source

Using Swift 3 or 4, you can access this HTTP request to break the connection.

// To get the POST data

  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() } 

// To get data from the request

 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() } } 

// To retrieve download content, such as an image or video, from a request

 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() } 
+1
Dec 22 '17 at 7:55
source



All Articles