NSURLRequest, почему Craigslist возвращает 404?

Я создаю свое первое приложение для iPhone, и я в тупике.

Я пытаюсь создать программу для чтения RSS, и я пытаюсь использовать канал из Craigslist. Этот код, использующий stackoverflow, возвращает «Код состояния: 200»:

- (void)parseRSSFeed:(NSString *)feed withDelegate:(id)delegate
{
 responseData = [[NSMutableData data] retain];
 feed = @"http://stackoverflow.com";
 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:feed]];
 [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 NSLog(@"status code: %d", [((NSHTTPURLResponse*) response) statusCode]);
 [responseData setLength:0];
}

Все хорошо. Но если я перейду, скажем, на "http://portland.craigslist.org/muc/", я получу код состояния 404.

Есть ли что-то, что я упускаю? Запрещает ли Craigslist доступ iPhone к своему веб-сайту? Есть ли какое-то экранирование, которое мне нужно сделать в URL-адресе?

Код с URL-адресом Craigslist находится здесь. Это точно так, как я его использую, и он возвращает 404:

- (void)parseRSSFeed:(NSString *)feed withDelegate:(id)delegate
{
 responseData = [[NSMutableData data] retain];
 feed = @"http://portland.craigslist.org/muc/";
 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:feed]];
 [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
}

person thekevinscott    schedule 01.10.2010    source источник


Ответы (2)


Хорошо, я понял это. Craigslist блокирует этот запрос. Тот же код работает, когда вы меняете имя приложения. Например, когда имя приложения содержало строку «Крейг», возвращаемый код ответа был 404. Когда я изменил имя приложения, чтобы оно не содержало имя «Крейг», ответ равен 200.

person Hari    schedule 06.12.2010

Craigslist блокирует запросы URL, если заголовок User-Agent содержит строку «craig». Apple по умолчанию включает имя вашего приложения в заголовок User-Agent ваших запросов URL. Чтобы обойти блокировку, используйте NSMutableURLRequest вместо NSURLRequest и подделайте заголовок User-Agent:

#define kUserAgentString @"Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:theURL] autorelease];
NSString *userAgent = kUserAgentString;
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
person Binyamin Bauman    schedule 24.05.2011