Получить порт по умолчанию для схемы? - PullRequest
3 голосов
/ 05 октября 2011

Есть ли способ узнать, какой номер порта NSURLRequest будет использовать для удовлетворения конкретного NSURL?

Очевидно, я мог бы жестко кодировать порт 80 для http запроса и порт 443 для https запросов. Но, безусловно, в Cocoa Touch есть встроенный способ получения номера порта из схемы URL.

Метод port для NSURL возвращает значение, только если порт указан в URL-адресе. Это будет работать для http://stackoverflow.com:80, но не для более распространенного http://stackoverflow.com.

Здесь контекст заключается в том, что я вхожу в веб-службу, которая перенаправляет меня (скажем, с (http://webservice.invalid/path/to/api до http://webservice2.invalid:2003/path/to/api).). Все URL-адреса основаны на базовом URL-адресе службы, который я хочу обновить до отражать реальность и избегать перенаправлений в будущем.

В данный момент я извлекаю схему и хост, но не учел, что порт также может измениться. Я не хочу указывать порт в будущих запросах, если я не получил порт как часть перенаправления.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

NSURLRequest имеет метод с именем URL, который возвращает NSURL, который имеет метод с именем port.

NSURLRequest request = ...;

NSNumber *port = [[request URL] port];
NSLog(@"Port: %d", [port intValue]);

Документация:

port
Возвращает номер порта URL-адреса, соответствующего RFC 1808.

- (NSNumber *) порт
Возвращаемое значение Номер порта URL. Если получатель не соответствует RFC 1808, возвращает ноль.

РЕДАКТИРОВАТЬ:

Если порт не задан в URL-адресе, и вы знаете схему, нет ничего плохого в жестком кодировании порта по умолчанию. Например. http = 80, https = 443, ftp = 21. Эти порты определены в стандарте, и вы можете просто хранить их в константе где-то в вашем коде, чтобы избежать магических чисел .

1 голос
/ 10 августа 2014

Не задавайте жестко порты.Вместо этого используйте getservent().

...