短い URL から完全な URL を取得する方法について、助けが必要です。
例: http://tinysong.com/HJ9h
そのリンクをクリックすると、grooveshark の URL が開きます。元のグルーブシャークの URL を取得するにはどうすればよいですか?
ありがとうございました
4 に答える
短縮 URL は、HTTP リダイレクトによって機能します。NSURLConnection
短い URL を使用してリクエストを設定し、デリゲートを設定できます。デリゲートで、メソッドを実装します。
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response;
response
が非の場合nil
、リダイレクトです。応答を調べることができます。それが実際にNSHTTPURLResponse
usingのインスタンスであるかどうかを確認し-isKindOfClass:
、そこから追加のデータを取得できます。
また、提案する新しいrequest
ものを調べることができます。NSURLConnection
その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:]
ターミナルからの簡単な方法
curl --head shorturl
これにより、短いヘッダーのみが表示され、そこに URL が表示されます。
例えば
$ 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
そして、それが指す URL がLocation
フィールドにあることがわかります。
したがって、これを NSTask で使用すると、操作できる結果文字列が得られます。
HTTP 301,302 1 つの 303 リダイレクトを使用するサービスを提供すると、最初の URL に対して HTTP 要求を行うことができます...
応答ヘッダーが 301、302、または 303 を再度返す場合は、ヘッダーで指定された新しい場所に別の要求を行います...ステータス コードが別のもの、つまり 200 になるまでこれを繰り返します...
次に、応答ヘッダーとvolaからホストとパスを読み取ることができます。長いURLがあります..
ヘッダーを取得するという点では...ネットワークのすべてのニーズにASIHTTPRequestを使用しています... http://allseeing-i.com/ASIHTTPRequest/How-to-useリダイレクトに従うオプションがあるので、リクエストを作成すると、ResponseHeaders を読み取って長い URL を取得できるようになります。
それが理にかなっていることを願っています