次の方法で共有


WinHTTP の Uniform Resource Locators (URL)

URL は、インターネット上にあるリソースの場所とアクセス方法をコンパクトに表現したものです。 各 URL は、スキーム (HTTP、HTTPS、FTP、または Gopher) とスキーム固有の文字列で構成されます。 この文字列には、ディレクトリ パス、検索文字列、またはリソースの名前の組み合わせを含めることもできます。 Microsoft Windows HTTP Services (WinHTTP) 関数は、URL を作成、結合、分割、および正規化する機能を提供します。 詳細については、「RFC 1738Uniform Resource Locators および RFC 2396Uniform Resource Identifiers (URI): Generic Syntax」を参照してください。

正規化された URL とは

URL の指定された構文とセマンティクスにより、バリエーションとエラーの余地が残ります。 正規化は、実際の URL を正しい標準の "正規" 形式に正規化するプロセスです。

これには、一部の文字を "エスケープ シーケンス" としてコーディングする必要があります。英数字 US-ASCII 文字をエンコードする必要はありません (数字 0 ~ 9、大文字 A ~ Z、小文字 a ~ z)。 他のほとんどの文字は、制御文字、スペース文字、パーセント記号、"unsafe characters" (<、>、"、#、{、}、|、\、^、~、[、]、および ' を含む)、および 127 を超えるコード ポイントを持つすべての文字をエスケープする必要があります。

WinHTTP 関数を使用した URL の処理

WinHTTP には、URL を処理するための 2 つの関数が用意されています。 WinHttpCrackUrl は、URL をコンポーネント パーツに分割し、WinHttpCreateUrl コンポーネントから URL を作成します。

URL の分離

WinHttpCrackUrl 関数は、URL をそのコンポーネント部分に分離し、関数に渡される URL_COMPONENTS 構造体によって示されるコンポーネントを返します。

URL_COMPONENTS 構造を構成するコンポーネントは、スキーム番号、ホスト名、ポート番号、ユーザー名、パスワード、URL パス、検索パラメーターなどの追加情報です。 スキームとポート番号を除く各コンポーネントには、情報を保持する文字列メンバーと、文字列メンバーの長さを保持するメンバーがあります。 スキームとポート番号には、対応する値を格納するメンバーのみが含まれます。WinHttpCrackUrlへの正常な呼び出しでは、スキームとポート番号の両方が返されます。

URL_COMPONENTS 構造体内の特定のコンポーネントの値を取得するには、そのコンポーネントの文字列長を格納するメンバーを 0 以外の値に設定する必要があります。 文字列メンバーには、バッファーへのポインターを指定することも、NULL することもできます。

ポインター メンバーにバッファーへのポインターが含まれている場合、文字列の長さのメンバーには、そのバッファーのサイズが含まれている必要があります。 WinHttpCrackUrl 関数は、コンポーネント情報をバッファー内の文字列として返し、文字列の長さを文字列の長さのメンバーに格納します。

ポインター メンバーが NULL 設定されている場合、文字列の長さのメンバーは 0 以外の値に設定できます。 WinHttpCrackUrl 関数は、コンポーネント情報を含む URL 文字列の最初の文字へのポインターを格納し、文字列の長さを、コンポーネントに関連する URL 文字列の残りの部分の文字数に設定します。

0 以外の長さのメンバーを持つ NULL に設定されたすべてのポインター メンバーは、URL 文字列内の適切な開始点を指します。 長さのメンバーに格納されている長さは、個々のコンポーネントの情報の末尾を決定するために使用する必要があります。

URL_COMPONENTS 構造体の初期化を正常に完了するには、dwStructSize メンバーを URL_COMPONENTS 構造体のサイズに設定する必要があります。

URL の作成

WinHttpCreateUrl 関数は、前に説明した URL_COMPONENTS 構造体の情報を使用して URL を作成します。

必要なコンポーネントごとに、ポインター メンバーには、情報を保持するバッファーへのポインターが含まれている必要があります。 ポインター メンバーに 0 で終わる文字列へのポインターが含まれている場合は、長さメンバーを 0 に設定する必要があります。ポインター メンバーに 0 で終わるでない文字列へのポインターが含まれている場合は、長さメンバーを文字列の長さに設定する必要があります。 不要なコンポーネントのポインター メンバーは、null 設定する必要があります。

サンプル コード

次のサンプル コードは、WinHttpCrackUrl を使用し、WinHttpCreateUrlして既存の URL を逆アセンブルし、そのコンポーネントの 1 つを変更して、新しい URL に再アセンブルする方法を示しています。

  URL_COMPONENTS urlComp;
  LPCWSTR pwszUrl1 = 
    L"https://search.msn.com/results.asp?RS=CHECKED&FORM=MSNH&v=1&q=wininet";
  DWORD dwUrlLen = 0;

  // Initialize the URL_COMPONENTS structure.
  ZeroMemory(&urlComp, sizeof(urlComp));
  urlComp.dwStructSize = sizeof(urlComp);

  // Set required component lengths to non-zero so that they are cracked.
  urlComp.dwSchemeLength    = (DWORD)-1;
  urlComp.dwHostNameLength  = (DWORD)-1;
  urlComp.dwUrlPathLength   = (DWORD)-1;
  urlComp.dwExtraInfoLength = (DWORD)-1;

  // Crack the URL.
  if( !WinHttpCrackUrl( pwszUrl1, (DWORD)wcslen(pwszUrl1), 0, &urlComp ) )
      printf( "Error %u in WinHttpCrackUrl.\n", GetLastError( ) );
  else
  {
    // Change the search information.  New info is the same length.
    urlComp.lpszExtraInfo = L"?RS=CHECKED&FORM=MSNH&v=1&q=winhttp";

    // Obtain the size of the new URL and allocate memory.
    WinHttpCreateUrl( &urlComp, 0, NULL, &dwUrlLen );
    LPWSTR pwszUrl2 = new WCHAR[dwUrlLen];

    // Create a new URL.
    if( !WinHttpCreateUrl( &urlComp, 0, pwszUrl2, &dwUrlLen ) )
      printf( "Error %u in WinHttpCreateUrl.\n", GetLastError( ) );
    else
    {
      // Show both URLs.
      printf( "Old URL:  %S\nNew URL:  %S\n", pwszUrl1, pwszUrl2 );
    }

    // Free allocated memory.
    delete [] pwszUrl2;
  }