3

短い URL から完全な URL を取得する方法について、助けが必要です。
例: http://tinysong.com/HJ9h
そのリンクをクリックすると、grooveshark の URL が開きます。元のグルーブシャークの URL を取得するにはどうすればよいですか?
ありがとうございました

4

4 に答える 4

3

短縮 URL は、HTTP リダイレクトによって機能します。NSURLConnection短い URL を使用してリクエストを設定し、デリゲートを設定できます。デリゲートで、メソッドを実装します。

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

responseが非の場合nil、リダイレクトです。応答を調べることができます。それが実際にNSHTTPURLResponseusingのインスタンスであるかどうかを確認し-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:]
于 2012-05-05T22:09:04.887 に答える
0

LongURLUntinyなどのAPIを使用できます。

于 2012-05-05T22:05:33.003 に答える
0

ターミナルからの簡単な方法

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 で使用すると、操作できる結果文字列が得られます。

于 2012-05-05T22:11:18.067 に答える
0

HTTP 301,302 1 つの 303 リダイレクトを使用するサービスを提供すると、最初の URL に対して HTTP 要求を行うことができます...

応答ヘッダーが 301、302、または 303 を再度返す場合は、ヘッダーで指定された新しい場所に別の要求を行います...ステータス コードが別のもの、つまり 200 になるまでこれを繰り返します...

次に、応答ヘッダーとvolaからホストとパスを読み取ることができます。長いURLがあります..

ヘッダーを取得するという点では...ネットワークのすべてのニーズにASIHTTPRequestを使用しています... http://allseeing-i.com/ASIHTTPRequest/How-to-useリダイレクトに従うオプションがあるので、リクエストを作成すると、ResponseHeaders を読み取って長い URL を取得できるようになります。

それが理にかなっていることを願っています

于 2012-05-05T22:14:37.763 に答える