Granit
Granit

Reputation: 1281

Consume ASP web service with JSON response on iOS

I am trying to call a web service that is developed with ASP.NET. The purpose is to pass a username and password to the web service to simulate a log-in procedure.

In order to call the service i used the following method:

 NSError *errorReturned = nil;
    NSString *urlString = @"http:myDomain/myMethod?Operation=SignIn";
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod: @"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:@"test" forKey:@"userName"];
    [dict setObject:@"test" forKey:@"passWord"];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions     error:&errorReturned];
    [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: jsonData];

    NSURLResponse *theResponse =[[NSURLResponse alloc]init];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&errorReturned];

    if (errorReturned)
    {
        NSLog(@"%@", errorReturned);
    }
    else
    {
        NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", retVal);

    }

After running the app and clicking on the UIButton that fires the above method, nothing is shown in the console window.

The service returns the response in JSON format.

I want to know if i am missing something here since i am neither getting an error nor success log?

Any help would be appreciated!

Thank you.

Granit

Upvotes: 1

Views: 814

Answers (2)

Granit
Granit

Reputation: 1281

I solved my issue by using ASIHHTPRequest. Also i checked the server interface and it turned out that the parameters had to be sent with the URL.

-(void)signInAction:(id)sender{

    NSURL *url = [NSURL URLWithString:@"http://mydomaain.com/UserService/SignIn/test/test"];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request setDidFinishSelector:@selector(requestCompleted:)];
    [request setDidFailSelector:@selector(requestError:)];

    [request setDelegate:self];
    [request setRequestMethod:@"GET"];
    [request startAsynchronous];
}

- (void)requestCompleted:(ASIHTTPRequest *)request
{
    NSString *responseString = [request responseString];
    //[responseString UTF8String];
    NSLog(@"ResponseString:%s",[responseString UTF8String]);

}

- (void)requestError:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"Error:%@",[error description]);
}

Upvotes: 0

Rob
Rob

Reputation: 437582

A couple of thoughts:

  1. If this method is getting called, you'd see something, even if retVal was empty and your

    NSLog(@"%@", retVal);
    

    just logged the app name and timestamp. Maybe change that NSLog to

    NSLog(@"retVal = %@", retVal);
    

    to remove any ambiguity. Or put in breakpoints in your code and single step through it to see what path the app takes.

  2. Are you confident of your server interface? For example, is it possible that the Operation value of SignIn belongs in the JSON request, itself? Also, some services are case sensitive, so you might want to check that, too.

    I don't know what access you have to the server, but it would be worthwhile to check the logs to make sure the request was received, possibly temporarily adding some logging within the code so you can confirm that the parameters were all received properly. Or, if nothing else, make sure that the server properly logs/reports any errors.

  3. BTW, your instantiation of theResponse is unnecessary, and should just be

    NSURLResponse *theResponse = nil;
    

    The sendSynchronousRequest call doesn't populate an existing NSURLResponse instance, but rather creates a new instance and updates theResponse to point to it.

  4. You should fix your request first, but you probably want, at the very least, to change this to use sendAsynchronousRequest instead of sendSynchronousRequest. You should never do synchronous calls on the main thread.

Upvotes: 0

Related Questions