2011-10-05 11 views
3

NSURLRequestが特定のポート番号NSURLを満たすために使用するポート番号を調べる方法はありますか?スキームのデフォルトポートを取得しますか?

もちろん、私はhttpリクエストのポート80とhttpsリクエストのポート443をハードコードすることができます。しかし確かに、Cocoa TouchのURLスキームからポート番号を取得する組み込みの方法があります。

NSURLportメソッドは、URLにポートが指定されている場合にのみ値を返します。それはhttp://stackoverflow.com:80で動作しますが、より一般的なものではありませんhttp://stackoverflow.com

ここでのコンテキストは、私がリダイレクトしているWebサービスにサインインしているということです(http://webservice.invalid/path/to/apiからhttp://webservice2.invalid:2003/path/to/apiに)。すべてのURLはサービスのベースに基づいています現実を反映して今後のリダイレクトを避けるために更新したいURLです。

現時点では、スキームとホストを抽出していますが、ポートが変更される可能性も考慮していませんでした。

答えて

3

NSURLRequestのメソッドは、というメソッドがあり、これはNSURLにはmetho dはポートと呼ばれます。

NSURLRequest request = ...; 

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

ドキュメント:

ポート
URLのポート番号は、RFC に準拠した1808を返します

- (のNSNumber *)ポート
戻り値ザ・URLのポート番号。 受信者がRFC 1808に準拠していない場合は、nilを返します。

EDIT:ポートがURLに設定し、計画を知っていない場合は

、デフォルトのポートをハードコーディングすると間違って何もありません。例えば。 http = 80, https = 443, ftp = 21。これらのポートは標準で定義されており、コードのどこかに定数を格納してmagic numbersを避けることができます。

+0

これは機能しません。ポートにURLが指定されていない場合、返されるポートはnilです。これは、スキームのデフォルトポートではなく、URLに指定されたポートだけです。 –

+0

最初の質問では、ポートがURLの一部ではないと明示する必要がありました。私はそれを更新しました。 –

+0

港には何が必要ですか?既定のポートはRFC 1808に従ってデフォルトで使用されるポートになるので、必要に応じてハードコーディングできます。 – Joe

1

ポートをハードコードしないでください。代わりにgetservent()を使用してください。

+0

私はクライアント上で実行されているサービスは魅力的ではありませんが、(ポートを指定する必要のある環境では)サーバー上のどのポートに接続するのかはわかりません。 –

+0

@StevenFisher 'getservent()'と 'getservbyname(const char *、const char *)'は、クライアント上で動作するサービスとは関係ありません。 'getservent()'のマニュアルページで、彼らは['services(5)'](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/services.5)を解析します。 HTMLファイル)。 – blarf

+0

有望です。私はこれを調べます。ありがとう。 –

関連する問題