Запрос FourSquare возвращает пустую строку в iOS

Я искал везде и, кажется, не могу найти решения. Я использую ASIHTTPRequest, чтобы подключиться к FourSquare API в моем приложении для iOS. Однако, когда я пытаюсь распечатать строку JSON, которую ожидаю вернуть мне, я получаю «null». Если я перейду к тому же URL-адресу запроса в браузере, я получу целую кучу JSON. Вот мой код ...

- (void)fetchFoursquareLocationsUsingLocation:(CLLocation *)location {
// First, let's build our request
CLLocationDegrees latitude = location.coordinate.latitude;
CLLocationDegrees longitude = location.coordinate.longitude;
NSString *foursquareURLString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=%0.6f,%0.6f&client_id=%@&client_secret=%@&v=20120103", 
                                 latitude,
                                 longitude,
                                 FOURSQUARE_CLIENT_ID, 
                                 FOURSQUARE_CLIENT_SECRET];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:foursquareURLString]];
self.foursquareData = [[NSMutableData alloc] init];

request.delegate = self;
[request startAsynchronous];
}

#pragma mark - ASIHTTPRequest Delegate
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
[self.foursquareData appendData:data];

}

- (void)requestFinished:(ASIHTTPRequest *)request {
NSString *jsonCheck = [[NSString alloc] initWithData:self.foursquareData encoding:NSUTF8StringEncoding];

NSLog(@"%@", jsonCheck);
}

ОБНОВЛЕНИЕ: благодаря сообщению SO @ Kamarshad Как получить места list Используя FourSquare Api, я смог вернуть действующий JSON. Разница в том, что я сделал запрос асинхронно, так что

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:foursquareURLString]];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request 
                                   queue:queue 
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    //
    if (error != nil) {
        NSLog(@"Something went wrong...%@", [error localizedDescription]);
    }
    else {
        NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", jsonString);
    }
}];

Что такого особенного в ASIHTTPRequest, который не дает правильному ответу вернуться?


person jmstone617    schedule 02.03.2012    source источник


Ответы (1)


Это происходит из-за того, что вы неправильно передаете значение V(date) во время запроса, вы просто передаете статическое (старое), которое может не работать после этой даты. Вам нужно будет передать Обновлено (текущее) V(date) в строке URL-адреса, т.е. V должно быть CurrentDate, в котором вы делаете запрос в FourSquare.

Попробуйте код ниже и используйте снова.

Обновление: еще кое-что. Вы должны передать что-то для поиска, потому что в вашем запросе вы не передаете поисковый запрос

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc]init] autorelease];
[dateFormatter setDateFormat:@"YYYYMMdd"];
NSString *dateString = [dateFormatter stringFromDate:currDate];
//dateString it;s used for being UpTodate for API request
NSString* rest=@"street"
// To be Search                                 

MakeRequest As below и остальная часть кода будут такими же, как вы использовали.

NSString *foursquareURLString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=%0.6f,%0.6f&client_id=%@&client_secret=%@&v=%@&query=%@", 
                             latitude,
                             longitude,
                             FOURSQUARE_CLIENT_ID, 
                             FOURSQUARE_CLIENT_SECRET,dateString,rest];
//Convert the Special characters into escapes. 

 foursquareURLString =[foursquareURLString  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:foursquareURLString]];
 //Rest will be same

Для получения дополнительных сведений о конечных точках FourSquare API перейдите по этой ссылке

Надеюсь, он даст вам правильный результат вместо Null !!!!!!!.

person Kamar Shad    schedule 02.03.2012
comment
Я жестко кодировал вчерашнюю дату (20120103), чтобы попытаться получить правильный ответ. Как я уже сказал, я бы получил JSON, если бы использовал тот же URL-адрес в веб-браузере, но NULL в своем приложении. Замена жестко запрограммированной даты текущей датой, отформатированной из [NSDate date], по-прежнему возвращает NULL. - person jmstone617; 02.03.2012
comment
@jmstone использовал ли вы правильный формат даты `NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [dateFormatter setDateFormat: @YYYYMMdd]; NSString * dateString = [dateFormatter stringFromDate: currDate] '...? - person Kamar Shad; 02.03.2012
comment
@jmstone проверьте, что вы получаете URL-адрес, я обновил приведенный выше ответ. Поскольку строка URL-адреса может иметь некоторый специальный символ, эти специальные символы необходимо преобразовать в экранирование. При нажатии этой строки URl (имеющей специальный символ) браузер автоматически заполняет Экранирует соответствующие специальные символы - person Kamar Shad; 02.03.2012
comment
Я это уже подтвердил. Более того, я скопировал URL-адрес из своего браузера, который создает действительный JSON, и вставил его непосредственно в строку URL-адреса (заменив отформатированную строку), но все равно получил обратно NULL. Я думаю, что, возможно, это либо а) запрос должен пройти через какой-то webView, либо б) возвращение данных и создание UTF8String из этих данных - неправильный подход. - person jmstone617; 02.03.2012
comment
Пробовал прошлой ночью :) По-прежнему ничего не возвращается. Я пробовал NSString * jsonCheck = [[NSString alloc] initWithData: self.foursquareData encoding: NSUTF8StringEncoding]; SBJsonParser * parser = [[SBJsonParser alloc] инициализация]; NSDictionary * dict = [парсер objectWithData: self.foursquareData]; - person jmstone617; 02.03.2012
comment
@jmstone см. этот ответ по этой ссылке stackoverflow.com/questions/7783027/, по этой ссылке я просто делаю синхронный запрос к FourSquare API. Вы также можете использовать синхронный запрос вместо выполнения ASIHTTPRequest. - person Kamar Shad; 02.03.2012
comment
Кроме того, я получаю данные из запроса. Так что это не похоже на то, что данные, которые я пытаюсь передать, изначально равны нулю или что-то в этом роде. - person jmstone617; 02.03.2012
comment
вы делаете неправильно .. просто посмотрите свой код NSDictionary * dict = [parser objectWithData: self.foursquareData]; self.foursquareData совершенно неверен, вы передаете NSData методу приема строки, который вам нужно передать jsonCheck. пожалуйста, пройдите по этой ссылке stackoverflow.com/questions/7783027/ - person Kamar Shad; 02.03.2012
comment
Поэтому я не знаю, почему использование ASIHTTPRequest по сравнению с вашим методом не сработало, но с использованием предоставленной вами ссылки SO, похоже, это работает. - person jmstone617; 02.03.2012