2012-05-05 43 views

回答

3

短網址的HTTP重定向的工作。您可以使用短網址請求設置NSURLConnection並設置代理。在委託,實施方法:

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response; 

如果response是非nil,這是一個重定向。您可以檢查響應。您可以使用-isKindOfClass:來檢查它是否爲NSHTTPURLResponse的實例,然後從中獲取其他數據。

此外,您還可以檢查新requestNSURLConnection建議。它的URL屬性將是服務器重定向您的連接請求的新URL。

如果您被重定向並且您有理由相信您不會被重定向,並且您完全感興趣,那麼您可以通過在連接對象上調用-cancel來取消連接請求。


更新。下面是一些示例代碼:

#import <Foundation/Foundation.h> 

static BOOL stop; 

@interface MyDelegate : NSObject 
@end 

@implementation MyDelegate 

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response 
{ 
    NSLog(@"request %@", request); 
    NSLog(@"response %@", response); 
    return response ? nil : request; 
} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"%s: error %@", __func__, error); 
    stop = TRUE; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%s", __func__); 
    stop = TRUE; 
} 

@end 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tinysong.com/HJ9h"]]; 
    MyDelegate* del = [[MyDelegate alloc] init]; 
    [NSURLConnection connectionWithRequest:req delegate:del]; 
    while (!stop) 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 

    [pool drain]; 
    return 0; 
} 

產生這樣的輸出:

request <NSURLRequest http://tinysong.com/HJ9h> 
response (null) 
request <NSURLRequest http://grooveshark.com/#!/s/~/3Xl6OQ?src=11> 
response <NSHTTPURLResponse: 0x103500340> 
-[MyDelegate connectionDidFinishLoading:] 
+0

我試過使用它,該方法是完美的工作。但我有一個問題。在該方法裏面檢索url的命令是什麼?示例代碼會很好。謝謝 –

+0

這應該提供新的URL:'[請求URL]'。 –

+0

我嘗試過,但它繼續給我http://tinysong.com/HJ9h –

0

一個簡單的方法來做到這一點從終端

curl --head shorturl 

這將只顯示短頭,你可以看到在那裏的網址。

例如

$ curl --head http://tinysong.com/HJ9h 
HTTP/1.1 301 Moved Permanenty 
Server: sharkattack! 
Date: Sat, 05 May 2012 22:13:10 GMT 
Content-Type: text/html; charset=UTF-8 
Connection: close 
Set-Cookie: TinysongSessionID=4518ef13c93199344a23bb9fe9af3e98; expires=Sat, 02-May-2015 22:13:10 GMT; path=/ 
Location: http://grooveshark.com/#!/s/~/3Xl6OQ?src=11 
Cache-Control: max-age=300 
Expires: Sat, 05 May 2012 22:18:10 GMT 
Vary: Accept-Encoding 
X-Hostname: rhl082 
X-N-Hostname: RHL082 

而且你可以看到它指向的是在Location領域的網址。

因此,使用這種帶有NSTask會給你一個結果字符串,你可以工作。

0

提供該服務使用HTTP 301,302一個303重定向你可以做一個HTTP請求到初始網址...

如果響應頭返回301,302或303重新再作要求在指定的新位置header ...然後你會重複這個,直到狀態碼是別的東西,比如200 ...

然後你可以從響應頭和volatile讀取主機和路徑,你有你的長URL ..

現在獲得頭方面......我用ASIHTTPRequest爲我所有的網絡需求...http://allseeing-i.com/ASIHTTPRequest/How-to-use它有一個選項來跟隨重定向,所以我認爲如果你提出請求,你將能夠讀取ResponseHeaders並獲得長URL。

希望有所裨益