Получить фактический URL из TinyURL

#objective-c #web-services #web-applications #ios4 #redirect

#objective-c #веб-сервисы #веб-приложения #ios4 #перенаправление

Вопрос:

Я хочу, чтобы пользователь получал фактический URL из TinyURL или Tiny.cc сервисы или любые другие средства перенаправления URL. Итак, возможно ли для меня получить фактические длинные URL-адреса из коротких перенаправленных URL-адресов, не создавая браузерное приложение, которое работает в фоновом режиме?

Заранее спасибо.

Заголовок:

 #import "UntitledViewController.h"


@implementation UntitledViewController

- (id)init 
{
    self = [super init];
    if (self) 
    {
        NSURL *url = [NSURL URLWithString:@"http://tinyurl.com/a3cx"];
        [self loadTinyURL:url];
    }
    return self;
}

- (void)loadTinyURL:(NSURL *)url 
{
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                                                                  delegate:self];
    if (!connection) 
        NSLog(@"could not connect with: %@", url);
}

- (NSURLRequest *)connection:(NSURLConnection *)connection 
             willSendRequest:(NSURLRequest *)request 
            redirectResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    int statusCode = [httpResponse statusCode];

    // http statuscodes between 300 amp; 400 is a redirect ...
    if (response amp;amp; statusCode >= 300 amp;amp; statusCode < 400) 
        NSLog(@"redirecting to : %@", [request URL]);

    return request;
}

@end
  

Реализация:

 //
//  UntitledViewController.h
//  Untitled
//
//  Created by tushar chutani on 11-04-19.
//  Copyright 2011 Fleetwood park secondary . All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UntitledViewController : UIViewController {

}

- (void)loadTinyURL:(NSURL *)url;

@end
  

Комментарии:

1. На самом деле нет смысла проверять статус, чтобы увидеть, является ли это перенаправлением, потому что метод должен вызываться только тогда, когда это перенаправление и у него есть redirectResponse. Тем не менее, мой пример проверяет и гарантирует, что tinyurl.com на самом деле выполняет перенаправление, если вы удалите эту проверку и просто проверите, что redirectResponse не равен нулю, он будет регистрировать все перенаправления даже после того, как tinyurl выполнит перенаправление.

2. Это определенно так, я делаю почти то же самое для интеграции Twitter / Facebook в приложении, над которым я работаю. Внутри проверки ответа и StatusCode я проверяю объект URL ответа, чтобы определить отправителя (используя -rangeOfString: метод), затем я сообщаю вызывающему через делегата, что URL перенаправления найден. Но моей целью было дать основы, дальнейшая настройка — это упражнение для читателя 🙂

3. Я пытаюсь сделать то же самое с IOS5. Есть ли у кого-нибудь пример кода для перехвата перенаправленного URL из первого TinyURL? Заранее спасибо.

Ответ №1:

У NSURLConnection есть соединение для обратного вызова:willSendRequest:redirectResponse:. На этом этапе вы можете проверить перенаправление, чтобы увидеть, куда вы направляетесь.

Обновить:

 - (NSURLRequest *)connection:(NSURLConnection *)connection 
             willSendRequest:(NSURLRequest *)request 
            redirectResponse:(NSURLResponse *)redirectResponse
{
    //Make sure tinyurl is doing the redirection
    if([[[redirectResponse URL] host] compare:@"tinyurl.com" 
                                      options:NSCaseInsensitiveSearch] == NSOrderedSame)
    {
        NSLog(@"Redirect Location: %@", [request URL]);
    }

    //call [connection cancel]; to cancel the redirect and stop receiving data
    //return nil; to cancel redirect but continue receiving data
    //return request; will continue the redirection as normal

    return request;
}
  

Комментарии:

1. возможно ли, чтобы вы привели мне какой-нибудь пример для этого?

2. @user710704: это довольно просто, реализуйте метод в своем делегате, и новый URL будет в URL свойстве запроса.

3. @user710704, отредактируй свой вопрос и опубликуй код, который ты написал на данный момент.

Ответ №2:

Проверьте следующий код:

 #import "TinyURLHandler.h"


@interface TinyURLHandler (Private)
- (void)loadTinyURL:(NSURL *)url;
@end


@implementation TinyURLHandler

- (id)init 
{
   self = [super init];
   if (self) 
   {
      NSURL *url = [NSURL URLWithString:@"http://tinyurl.com/a3cx"];
      [self loadTinyURL:url];
   }
   return self;
}

- (void)loadTinyURL:(NSURL *)url 
{
   NSURLRequest *request = [NSURLRequest requestWithURL:url];
   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                                                                 delegate:self];
   if (!connection) 
      NSLog(@"could not connect with: %@", url);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
   NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
   int statusCode = [httpResponse statusCode];
   NSLog(@"%d : %@", statusCode, [NSHTTPURLResponse 
                                  localizedStringForStatusCode:statusCode]);   
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   [connection release];
   NSLog(@"finished");
}

- (NSURLRequest *)connection:(NSURLConnection *)connection 
             willSendRequest:(NSURLRequest *)request 
            redirectResponse:(NSURLResponse *)response
{
   NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
   int statusCode = [httpResponse statusCode];

   // http statuscodes between 300 amp; 400 is a redirect ...
   if (response amp;amp; statusCode >= 300 amp;amp; statusCode < 400) 
      NSLog(@"redirecting to : %@", [request URL]); 

   return request;
}

@end
  

@ openingsposter: Я не уверен на 100%, почему вы хотите увидеть оригинальный проект, я думаю, это потому, что вы хотите выяснить, какой был бы хороший способ извлечь окончательный URL? Что ж, я бы посоветовал вам создать делегата и сообщить вызывающему, как только вы получите окончательный URL. Если вам нужен пример, я могу добавить больше исходного кода…

Комментарии:

1. можете ли вы загрузить свой проект куда-нибудь, чтобы я мог взглянуть на весь проект? Пожалуйста

2. Вы можете загрузить пример проекта iOS из моего Dropbox: dl.dropbox.com/u/6487838/TinyURL.zip

3. Зависит от того, происходит ли перенаправление через стандарт HTTP, что означает, что заголовок HTTP, возвращаемый веб-сервером, должен содержать код состояния HTTP для перенаправления. Возможно, вы могли бы показать мне URL, который вы используете для извлечения MP3?

4. Эта ссылка показывает код состояния HTTP 404, то есть файл не существует. Для этого файла нет перенаправления. Я попробовал другой файл, и он перенаправляет для меня, у вас это тоже работает? mp3bear.com/inc/audio.php?id=2520

5. Чтобы выяснить коды состояния HTTP, я рекомендую вам установить FireFox и использовать встроенную веб-консоль (меню Tools ).