Pobieranie danych przy użyciu skryptu
Ten temat zawiera przykład sposobu pisania skryptu, który uzyskuje dane za pośrednictwem usług HTTP systemu Microsoft Windows (WinHTTP) synchronicznie lub asynchronicznie. Pojęcia przedstawione w tym przykładzie stanowią podstawę pisania aplikacji klienckich lub serwerów warstwy środkowej, które wymagają dostępu do danych przy użyciu protokołu HTTP.
- wymagania wstępne i wymagania
- pobieranie danych synchronicznie
- pobieranie danych asynchronicznie
- Tematy pokrewne
Wymagania wstępne i wymagania
Oprócz działającej wiedzy na temat języka Microsoft JScript ten przykład wymaga następujących elementów:
- Bieżąca wersja zestawu Microsoft Windows Software Development Kit (SDK).
- Narzędzie konfiguracji serwera proxy do ustanawiania ustawień serwera proxy dla usług HTTP systemu Microsoft Windows (WinHTTP), jeśli połączenie z Internetem odbywa się za pośrednictwem serwera proxy. Aby uzyskać więcej informacji, zobacz ProxyCfg.exe, narzędzie do konfiguracji serwera proxy.
- Znajomość terminologii sieciowej i pojęć.
Synchroniczne pobieranie danych
Aby utworzyć skrypt, który uzyskuje tekst ze strony sieci Web synchronicznie, wykonaj następujące czynności:
Otwórz edytor tekstów.
Skopiuj następujący kod do edytora tekstów.
function getText(strURL) { var strResult; try { // Create the WinHTTPRequest ActiveX Object. var WinHttpReq = new ActiveXObject( "WinHttp.WinHttpRequest.5.1"); // Create an HTTP request. var temp = WinHttpReq.Open("GET", strURL, false); // Send the HTTP request. WinHttpReq.Send(); // Retrieve the response text. strResult = WinHttpReq.ResponseText; } catch (objError) { strResult = objError + "\n" strResult += "WinHTTP returned error: " + (objError.number & 0xFFFF).toString() + "\n\n"; strResult += objError.description; } // Return the response text. return strResult; } WScript.Echo(getText("https://www.microsoft.com/default.htm"));
Zapisz plik jako "Retrieve.js".
W wierszu polecenia wpisz "cscript Retrieve.js" i naciśnij ENTER.
Masz teraz skrypt, który używa obiektu WinHttpRequest w celu uzyskania kodu źródłowego HTML dla strony sieci Web w https://www.microsoft.com. Może być konieczne odczekanie kilku sekund na wyświetlenie kodu.
Aplikacja zawiera tylko jedną funkcję "getText". Pierwszy wiersz skryptu tworzy obiekt WinHttpRequest.
// Create the WinHTTPRequest ActiveX Object.
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
Gdy aparat JScript napotka ten wiersz, tworzy wystąpienie tego obiektu. Jeśli zostanie wyświetlony komunikat o błędzie "Składnik ActiveX nie może utworzyć obiektu", najprawdopodobniej WinHttp.dll nie został prawidłowo zarejestrowany lub nie istnieje w systemie.
Następny wiersz skryptu wywołuje metodę Open.
// Create an HTTP request.
WinHttpReq.Open("GET", "https://www.microsoft.com", false);
Trzy parametry określają, którego czasownika HTTP użyć, nazwę zasobu oraz czy używać WinHTTP synchronicznie lub asynchronicznie. W tym przykładzie metoda używa czasownika HTTP"GET" w celu uzyskania danych z https://www.microsoft.com. Określenie false dla ostatniego parametru określa, że transakcja występuje synchronicznie. Metoda Open nie nawiązuje połączenia z zasobem, co może oznaczać nazwa. Zamiast tego inicjuje wewnętrzne struktury danych, które utrzymują informacje o sesji, połączeniu i żądaniu.
Metoda Send tworzy nagłówki żądania i wysyła żądanie. Po wywołaniu w trybie synchronicznym metoda Send również czeka na odpowiedź przed zezwoleniem aplikacji na kontynuowanie.
// Send the HTTP request.
WinHttpReq.Send();
Po wysłaniu żądania skrypt zwraca wartość właściwości ResponseText obiektu WinHttpRequest. Ta właściwość zawiera treść jednostki odpowiedzi, w tym przypadku źródło dokumentu.
// Get the response text.
return WinHttpReq.ResponseText;
Wykonanie skryptu jest wstrzymywane podczas pobierania całego tekstu zasobu. Tekst zasobu jest zwracany z funkcji i wyświetlany.
Obiekt WinHttpRequest gwarantuje, że wszystkie zasoby wewnętrzne przydzielone dla transakcji HTTP zostaną zwolnione.
Pobieranie danych asynchronicznie
Pobieranie danych asynchronicznie przy użyciu winHTTP jest bardzo podobne do synchronicznego pobierania danych. Zmodyfikuj skrypt z poprzedniej sekcji, wprowadzając dwie małe zmiany.
Ustaw trzeci parametr metody Open na wartość "true" zamiast "false", aby określić, że metody WinHTTP powinny być wykonywane asynchronicznie.
// Create a HTTP request. var temp = WinHttpReq.Open("GET", strURL, true);
Wywołaj metodę WaitForResponse przed uzyskaniem dostępu do właściwości ResponseText, aby upewnić się, że cała odpowiedź została odebrana.
// Send the HTTP request. WinHttpReq.Send(); // Wait for the entire response. WinHttpReq.WaitForResponse(); // Retrieve the response text. strResult = WinHttpReq.ResponseText;
Główną zaletą używania metody WinHTTP asynchronicznie w skrypcie jest to, że metoda Send zwraca natychmiast. Żądanie jest przygotowywane i wysyłane przez wątek roboczy. Dzięki temu aplikacja może wykonywać inne czynności podczas oczekiwania na odpowiedź. Przed podjęciem próby uzyskania dostępu do odpowiedzi upewnij się, że cała odpowiedź została odebrana przez wywołanie metody WaitForResponse. W przeciwnym razie może wystąpić błąd.
Metoda WaitForResponse może również służyć do określenia wartości limitu czasu dla transakcji. Opcjonalny parametr umożliwia określenie wartości limitu czasu w sekundach.
Tematy pokrewne