mmvie
mmvie

Reputation: 2571

Asynchronous POST to server

The goal is to do a simple username/password authentication by querying a database. Until the connection is working decently my php destination file simply has following code:

echo "Posted: " . $_POST['email'];

The code to do this synchronously is this:

NSString *post = [[NSString alloc] initWithFormat:@"email=%@&password=%@", self.email.text, ..]; // .. simplified keychainItem
NSData *postEncoded = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
NSString *postLength = [NSString stringWithFormat:@"%d", [postEncoded length]];

NSURL *url = [NSURL URLWithString:@"http://eng.studev.groept.be/web2.0/a11_web02/improver/app/testPost"];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postEncoded];

NSError *error = nil;
NSURLResponse *response = nil;
NSData *encodedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSString *data=[[NSString alloc]initWithData:encodedData encoding:NSUTF8StringEncoding];
NSLog(@"Data? %@",data);

The correct value is shown as an echo. But when trying to do this asynchronously, I get following php error: "Undefined index: email". I try to start the asynchronous request with this line:

[[NSURLConnection connectionWithRequest:request delegate:self] start];

Then, I have the delegate method connection:didReceiveResponse, but there I cannot seem to get the data out... Or do I need another delegate method? Also, how 'safe' is it to check the result of your query by using just an echo (do I need/want a stream maybe?) ??

Tia

EDIT

Problem related to the server, not to objective-C code. Asked a new question to reach the correct audience: $_POST remaining empty

Upvotes: 1

Views: 1171

Answers (2)

XJones
XJones

Reputation: 21967

@ott is on the right track, I'll try to clarify.

  1. You don't need start as he says. It's benign as the connection will start automatically.

  2. initWithRequest:delegate and connectionWithRequest:delegate: are equivalent except for the retain state of the new connection object.

  3. The real problem is b/c you are using connectionWithRequest:delegate the returned connection is autoreleased at the end of the run loop and you are not retaining it in a property. Therefore, the connection never starts.

The solution is to add a property @property (nonatomic, retain) NSURLConnection *connection to your class and set this property to the connection returned from connection:withRequest:

You then release the connection in the completion methods connection:didFinishLoading and connection:didFailWithError:.

Upvotes: 2

ott--
ott--

Reputation: 5702

The start is wrong here. Simply use

self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

with NSURLConnection *connection; defined. See the class reference for connectionWithRequest. start is to be used with initWithRequest:delegate:.

Upvotes: 0

Related Questions