I am using this code to send a JSON to a .NET service to register a user:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
deviceID, @"DeviceId",
model, @"DeviceModel",
user, @"Username",
pass, @"Password",
email, @"email",
nil];
NSDictionary *consumer = [NSDictionary dictionaryWithObject:dictionary forKey:@"consumer"];
NSLog(@"%@", consumer);
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:consumer
options:kNilOptions
error:&error];
NSLog(@"%@", error);
NSString *urlString = @"http://aservice.co.uk/services/service.svc/RegisterConsumer";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLResponse *response = NULL;
NSError *requestError = NULL;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ;
NSLog(@"%@", responseString);
NSLog(@"%@", requestError);
This works fine as I receive back a JSON result of {"RegisterConsumerResult":"True"}
Now when I try to register a username that I know already exists, I get back the following HTML as the responseString:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>
<title>Request Error</title>
<style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style> </head> <body>
<div id="content">
<p class="heading1">Request Error</p>
<p>The server encountered an error processing the request. See server logs for more details.</p>
</div> </body> </html>
Obviously this isn’t returning an actual error, just a web page telling me there was an error.
Have a missed a way to retrieve the actual error code from the service?
Is it possible that the service could be sending the error as a response somehow?
EDIT–
I forgot to mention, the actual errorResponse is nil, I’m assuming because HTML was returned that the actual request is classed as successful.
First off, to check what the status code is so you can handle the >400 errors like so:
If you want to use AFNetworking it can be pretty simple to do this, just add the library (find it here: http://afnetworking.com) then do it like this:
This is using an asynchronous connection (you should!) then you can call your next step in the success block.
I didn’t test this but it should work (or very close ) for what you need to do.
Update
Maybe you can use this code (I grabbed from HERE ) to see what kind of data — if any — they are providing in the header and see if it’s useful.