user1447300
user1447300

Reputation:

Objective C NSMutableURLRequest GET request returns null JSON

trying get Data from server using @"GET" request, this following code returns null all time:

is anybody finding an issue with my following code?

or it's can be server side Issue.. ?

thank for your help!

+ (id)sendParam:(NSString*)ParamString url:(NSString*)url{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];


    NSString *post = ParamString;

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

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

    [request setURL:[NSURL URLWithString:url]];


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

    [request setHTTPBody:postData];
    [request setHTTPMethod:@"GET"];
    [request addValue:ParamString forHTTPHeaderField:@"GET"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];


    NSURLResponse *response;
    NSError *error;

    NSData *aData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    NSMutableArray*jsonReturn = [[NSMutableArray alloc]init];
    jsonReturn = (NSMutableArray*)[NSJSONSerialization JSONObjectWithData:aData options:kNilOptions error:&error];
    NSLog(@"jsonReturn %@",jsonReturn);

    return jsonReturn;
}

after Editing:

  + (id)sendParam:(NSString*)ParamString url:(NSString*)url{

    NSString*StringGETMETHOD = [NSString stringWithFormat:@"%@%@",url,ParamString];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:[NSURL URLWithString:StringGETMETHOD]];
    [request setHTTPMethod:@"POST"];


    NSURLResponse *response;
    NSError *error;

    NSData *aData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"aData=%@",aData);


    if (aData) {

        jsonReturn=(NSMutableArray*)[NSJSONSerialization JSONObjectWithData:aData options:kNilOptions error:&error];

        NSLog(@"jsonReturn %@",jsonReturn);


}

Upvotes: 1

Views: 7567

Answers (4)

user1447300
user1447300

Reputation:

i found my issue:

sending paramString Using "Get" Method, cannot send parameters with space between letters.. example: "tel aviv" should be "tel%20aviv"

by adding the following code line:

 **urlParam = [urlParam
                  stringByReplacingOccurrencesOfString:@" " withString:@"%20"];**

fix code:

 + (id)sendParam:(NSString*)ParamString url:(NSString*)url{

    NSString* urlParam = [NSString stringWithFormat:@"%@%@",url,ParamString];

 urlParam = [urlParam
                  stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

  NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlParam]];

    [request setHTTPMethod:@"GET"];

    [request setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"content-type"];



    NSURLResponse *response;
    NSError *error;

    NSData *aData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"aData=%@",aData);


    if (aData) {

        jsonReturn=(NSMutableArray*)[NSJSONSerialization JSONObjectWithData:aData options:kNilOptions error:&error];

        NSLog(@"jsonReturn %@",jsonReturn);


}

thank you all !

Upvotes: 0

Wain
Wain

Reputation: 119021

You seem to be confused between GET and POST. You are doing a GET, but supplying data like a POST (usually does, though it isn't mandated, or precluded to use the body data for a GET).

Generally, you don't want to use body data for a GET, it isn't usual / expected so any number of different issues could be occurring. Either change setHTTPMethod: to @"POST" so you are doing a POST properly, or change the parameters to be part of the request URL.

It really all depends what the server expects (and can handle). This is what you need to know and match against...


Subsequently you have a different issue. The param string you supply has characters in it that need to be encoded (like spaces). Use stringByAddingPercentEscapesUsingEncoding: on the param string before you send it to escape these characters.

It works in a browser because it is adding the escape characters for you (which you should see in the browser address bar after it has loaded the response).

Upvotes: 0

user3182143
user3182143

Reputation: 9589

If you want to use GET for getting response from server just you can try in following method

//just give your URL instead of my URL
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL  URLWithString:@"http://api.worldweatheronline.com/free/v1/search.ashx?query=London&num_of_results=3&format=json&key=xkq544hkar4m69qujdgujn7w"]];

[request setHTTPMethod:@"GET"];

[request setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"content-type"];

NSError *err;

NSURLResponse *response;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request   returningResponse:&response error:&err];

 //You need to check response.Once you get the response copy that and paste in ONLINE JSON VIEWER.If you do this clearly you can get the correct results.    

 //After that it depends upon the json format whether it is DICTIONARY or ARRAY 

NSDictionary *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options: NSJSONReadingMutableContainers error: &err];

NSArray *array=[[jsonArray objectForKey:@"search_api"]objectForKey:@"result"];

Upvotes: 3

gnasher729
gnasher729

Reputation: 52530

I very much doubt that you should send this parameter as a HEADER field. I also would think that you should be sending a POST and not a GET.

Setting jsonReturn to [[NSMutableArray alloc] init] is nonsense. Explain to yourself why you are doing it instead of setting jsonReturn to nil

Logging the jsonReturn is nonsense, because all the interesting stuff has disappeared. You should log the response and the data that was returned, at least if jsonReturn = nil.

Upvotes: 1

Related Questions