我需要一些关于如何从一个简短的 URL 中检索完整 URL 的帮助。
例如:http
:
//tinysong.com/HJ9h 如果您单击该链接,它将打开一个grooveshark url。如何检索原始的grooveshark 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
Location
您可以在该字段中看到它指向的 url 。
因此,将其与 NSTask 一起使用将为您提供可以使用的结果字符串。
如果服务使用 HTTP 301,302 一个 303 重定向,您可以向初始 URL 发出 HTTP 请求...
如果响应标头再次返回 301,302 或 303,则向标头中指定的新位置发出另一个请求...然后您将重复此操作,直到状态代码为其他内容,即 200...
然后你可以从响应头和vola中读取主机和路径,你有你的长URL..
现在在获取标头方面......我使用 ASIHTTPRequest 来满足我所有的网络需求...... http://allseeing-i.com/ASIHTTPRequest/How-to-use它有一个跟随重定向的选项,所以我想如果你发出请求,然后您将能够读取 ResponseHeaders 并获取长 URL。
希望这有点道理