2010-10-01 71 views
2

我正在構建我的第一個iPhone應用程序,並且我受阻。NSURLRequest,爲什麼craigslist返回404?

我正在嘗試構建一個RSS閱讀器,並試圖使用來自craigslist的訂閱源。此代碼使用計算器返回「狀態代碼: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]; 
} 

一切都很好。但是,如果我更改feed,例如「http://portland.craigslist.org/muc/」,我會得到404的狀態代碼。

有什麼我失蹤了嗎? Craigslist是否禁止iPhone訪問其網站?我需要在URL上進行一些轉義嗎?

這裏帶有craigslist URL的代碼。這正如我使用它,它會返回一個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]; 
} 

回答

3

好吧,我想通了。 Craigslist阻止了這個請求。當您更改應用程序的名稱時,相同的代碼有效。例如,當應用程序名稱包含字符串「craig」時,返回的響應代碼是404。當我將應用程序名稱更改爲不包含名稱「craig」時,則響應爲200.

+0

甜蜜,謝謝Hari! – thekevinscott 2010-12-07 21:14:34

3

Craigslist阻止URL請求if用戶代理標題包含字符串「craig」。默認情況下,Apple將您的應用程序名稱包含在您的URL請求的User-Agent標頭中。爲了解決這個問題,使用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"];