У меня есть URL-адрес из rss-канала, который при просмотре в браузере перенаправляет на полный URL-адрес, содержащий идентификаторы, которые мне нужны в приложении. Есть ли способ в приложении, что я могу взять упрощенный URL-адрес, который поступает из фида (например, www.somesite.com/Thing1) и, по существу, переслать ссылку, чтобы получить полный URL-адрес (например, www.somesite.com/id= 21424255) все в приложении.iPhone SDK: получить переадресованный URL-адрес
ответ
Вам нужно будет сделать NSURLRequest
на короткий URL-адрес и получить ответ. Вы хотите, чтобы это было как NSHTTPURLResponse
- подкласс NSURLResponse
Предположительно, если он выполняет перенаправление 301, вы можете прочитать заголовки ответов и получить URL-адрес из заголовка «Местоположение».
NSDictionary *headers = [myHTTPResponse allHeaderFields];
NSString *redirectLocation = [headers objectForKey:@"Location"];
Взгляните на this вопрос для более подробного примера создания NSURLConnection
с просьбой.
Редактирование: Несмотря на то, что приведенный выше код является истинным для других полей заголовка, как указал Адам, ниже, вам нужно будет использовать метод делегата connection:willSendRequest:redirectResponse:
, чтобы захватить местоположение перенаправления, когда перенаправление обрабатывается автоматически.
Если короткий URL-адрес перенаправляется на полный URL-адрес, NSURLConnection обрабатывает перенаправление прозрачно. Чтобы получить URL-адрес переадресации, вам необходимо реализовать
- (NSURLRequest *)connection: (NSURLConnection *)inConnection
willSendRequest: (NSURLRequest *)inRequest
redirectResponse: (NSURLResponse *)inRedirectResponse
на делегате NSURLConnection. Целевой URL-адрес перенаправления: [inRequest URL]
Удачи.
Прежде всего, есть 3 способа узнать новое URL-соединение. (1) NSURLSession (2) NSURLConnection (3) NSURLDownload. Я использую здесь NSURLConnection, чтобы объяснить вам, как это сделать.
(1) Прежде всего, выберите URL, который перенаправляет (я выбираю здесь «http://www.google.com», потому что он будет перенаправлен на «http://www.google.co.in/?gws_rd=cr&ei=LEfeUvCeA8aLrQew04GICQ») .Теперь первым, создайте два свойства в файле .h, как показано ниже.
@interface ConfigViewController()
@property (nonatomic, retain) NSURLRequest *request;
@property (nonatomic, strong, readwrite) NSURLConnection *connection;
@end
(2) Затем синтезируйте свои свойства в формате .m.
@synthesize request;
@synthesize connection = _connection;
(3) Затем создайте NSURLRequest и NSURLConnection.
- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
assert(self.request != nil);
self.connection = nil;
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
assert(self.connection != nil);
}
утверждает, убедитесь, что ваш подготовленный запрос не будет нулевым, если это будет ноль, то он будет показывать ошибку на этом месте только, то вы должны убедиться, что вы следуете этому коду правильно ,
(4) Теперь выполните эти две делегирования в вашем .h файле - NSURLConnectionDelegate & NSURLConnectionDataDelegate.
@interface WTViewController : UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate>{
IBOutlet UITextView *txtPreviousLbl;
IBOutlet UITextView *txtNextlbl;
}
(5) Затем выполните эти 3 метода делегирования в файл .m (implementation).
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectedResponse{
NSURLRequest *redirectedRequest = request;
if (redirectedResponse) {
redirectedRequest = nil;
}
NSLog(@"RedirectedRequest:%@",redirectedRequest);
return redirectedRequest;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"error:%@",error);
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"Response:%@",response);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *responseDictionary = [httpResponse allHeaderFields];
NSString *strNewURLLocation = [responseDictionary objectForKey:@"Location"];
NSLog(@"ResponseDictionary:%@",[responseDictionary objectForKey:@"Location"]);
[[NSUserDefaults standardUserDefaults] setObject:strNewURLLocation forKey:@"serverurl"];
NSLog(@"NewURLLocation:%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"serverurl"]);
}
Здесь вы получите новый URL-адрес в [[NSUserDefaults standardUserDefaults] objectForKey: @ "ServerURL"], Вы можете использовать NSUserDefaults или NSString для пользователей во всем вашем проекте. Примечание: Пожалуйста, не забудьте сделать этот код только в UIViewController.иначе может быть возможно, что ваша делегация не будет работать в других объектных файлах. Имейте счастливый код ...