Dela via


Url:er (Uniform Resource Locators) i WinHTTP

En URL är en kompakt representation av platsen och åtkomstmetoden för en resurs som finns på Internet. Varje URL består av ett schema (HTTP, HTTPS, FTP eller Gopher) och en schemaspecifik sträng. Den här strängen kan också innehålla en kombination av en katalogsökväg, söksträng eller namnet på resursen. Funktionerna Microsoft Windows HTTP Services (WinHTTP) ger möjlighet att skapa, kombinera, dela upp och kanonisera URL:er. Mer information finns i RFC 1738, Uniform Resource Locators and RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax.

Vad är en kanonisk url?

Den angivna syntaxen och semantiken för URL:er lämnar utrymme för variation och fel. Canonicalization är processen för att normalisera en faktisk URL till en korrekt, standard, "kanonisk" form.

Detta innebär att koda vissa tecken som "escape-sekvenser". Alfanumeriska US-ASCII tecken behöver inte kodas (siffrorna 0-9, versaler A-Z och gemener a-z). De flesta andra tecken måste vara undantagna, inklusive kontrolltecken, blankstegstecken, procenttecken, "osäkra tecken" ( <, >, ", #, {, }, |, \, ^, ~, [, ], och ' ), och alla tecken med en kodpunkt över 127.

Använda WinHTTP Functions för att hantera URL:er

WinHTTP innehåller två funktioner för hantering av URL:er. WinHttpCrackUrl separerar en URL till dess komponentdelar och WinHttpCreateUrl skapar en URL från komponenter.

Separera URL:er

Funktionen WinHttpCrackUrl separerar en URL i dess komponentdelar och returnerar de komponenter som anges av den URL_COMPONENTS struktur som skickas till funktionen.

De komponenter som utgör URL_COMPONENTS struktur är schemanummer, värdnamn, portnummer, användarnamn, lösenord, URL-sökväg och ytterligare information, till exempel sökparametrar. Varje komponent, förutom schema- och portnummer, har en strängmedlem som innehåller informationen och en medlem som innehåller längden på strängmedlemmen. Schemat och portnumren har bara en medlem som lagrar motsvarande värde. både schemat och portnumren returneras vid alla lyckade anrop till WinHttpCrackUrl.

Om du vill hämta värdet för en viss komponent i den URL_COMPONENTS strukturen måste den medlem som lagrar stränglängden för komponenten anges till ett värde som inte är noll. Strängmedlemmen kan antingen vara en pekare till en buffert eller NULL-.

Om pekarmedlemmen innehåller en pekare till en buffert måste stränglängdsmedlemmen innehålla buffertens storlek. Funktionen WinHttpCrackUrl returnerar komponentinformationen som en sträng i bufferten och lagrar stränglängden i stränglängdsmedlemmen.

Om pekarmedlemmen är inställd på NULL-kan stränglängdsmedlemmen anges till valfritt värde som inte är noll. Funktionen WinHttpCrackUrl lagrar en pekare till det första tecknet i URL-strängen som innehåller komponentinformationen och anger stränglängden till antalet tecken i den återstående delen av URL-strängen som gäller komponenten.

Alla pekarmedlemmar är inställda på NULL- med en medlemspunkt som inte är längre än noll till lämplig startpunkt i URL-strängen. Längden som lagras i längdmedlemmen måste användas för att fastställa slutet på den enskilda komponentens information.

För att slutföra initieringen av URL_COMPONENTS struktur korrekt måste dwStructSize- medlem anges till storleken på den URL_COMPONENTS strukturen.

Skapa URL:er

Funktionen WinHttpCreateUrl använder informationen i den tidigare beskrivna URL_COMPONENTS-strukturen för att skapa en URL.

För varje nödvändig komponent ska pekarmedlemmen innehålla en pekare till bufferten som innehåller informationen. Längdmedlemmen ska anges till noll om pekarmedlemmen innehåller en pekare till en sträng med noll ändrad. längdmedlemmen ska anges till stränglängden om pekarmedlemmen innehåller en pekare till en sträng som inte är noll-avslutad. Pekarmedlemmen för alla komponenter som inte krävs måste anges till NULL-.

Exempelkod

Följande exempelkod visar hur du använder WinHttpCrackUrl och WinHttpCreateUrl för att demontera en befintlig URL, ändra en av dess komponenter och sätta ihop den till en ny URL igen.

  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;
  }