Klient HTTP ABL 2
Kontynuując temat związany z budowaniem klienta HTTP w aplikacji ABL, napiszę krótko o najprostszym uwierzytelnianiu. Zabezpieczenia w serwerze PASOE opisałem w serii artykułów, a teraz przyda się odświeżenie podstawowych wiadomości zamieszczonych tutaj.
W lokalizacji dla web aplikacji …\webapps\myrest\WEB-INF znajduje się plik oeablSecurity.properties. Znajdujemy w nim wpis: client.login.model=anonymous i zmieniamy na basic. Wymusi to logowanie się do serwisu.
Sposób uwierzytelniania widoczny jest poprzez parametr http.all.authmanager=local oznaczający, że uwierzytelnienie jest lokalne w oparciu o użytkowników zdefiniowanych w pliku:
C:\WrkOpenEdge121\mysec\webapps\ROOT\WEB-INFF\users.properites.
Na pierwszej pozycji znajduje się wpis: restuser=password,ROLE_PSCUser,enabled. Zapamiętujemy nazwę użytkownika i hasło (możemy także zdefiniować własnych użytkowników).
USING OpenEdge.Core.Collections.IStringStringMap FROM PROPATH. USING OpenEdge.Net.HTTP.ClientBuilder FROM PROPATH. USING OpenEdge.Net.HTTP.Credentials FROM PROPATH. USING OpenEdge.Net.HTTP.IHttpClient FROM PROPATH. USING OpenEdge.Net.HTTP.IHttpRequest FROM PROPATH. USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH. USING OpenEdge.Net.HTTP.RequestBuilder FROM PROPATH. USING OpenEdge.Net.URI FROM PROPATH. USING Progress.Json.ObjectModel.JsonObject FROM PROPATH. USING Progress.Json.ObjectModel.ObjectModelParser FROM PROPATH. /* *************************** Main Block *************************** */ DEFINE VARIABLE oClient AS IHttpClient NO-UNDO. DEFINE VARIABLE oURI AS URI NO-UNDO. DEFINE VARIABLE oRequest AS IHttpRequest NO-UNDO. DEFINE VARIABLE oForm AS IStringStringMap NO-UNDO. DEFINE VARIABLE OResponse AS IHttpResponse NO-UNDO. DEFINE VARIABLE oJsonObject AS JsonObject NO-UNDO. DEFINE VARIABLE JsonString AS LONGCHAR NO-UNDO. DEFINE VARIABLE iCount AS INTEGER NO-UNDO. DEFINE VARIABLE oCreds AS Credentials NO-UNDO. // Build the client oClient = ClientBuilder:Build():Client. oURI = URI:Parse("http://localhost:8810/myrest/rest/myrestService/customer?filter=CustNum=4000"). // Create credentials oCreds = NEW Credentials(). oCreds:UserName = "restuser". oCreds:Password = "password". // Build the request oRequest = RequestBuilder:GET(oURI):UsingBasicAuthentication(oCreds):Request. // Execute the request oResponse = oClient:Execute(oRequest). //Process the response IF oResponse:StatusCode <> 200 THEN DO: MESSAGE "Request Error " + STRING(OResponse:StatusCode). RETURN ERROR "Request Error: " + STRING(oResponse:StatusCode). END. ELSE DO: oJsonObject = CAST(oResponse:Entity, JsonObject). oJsonObject:Write(JsonString, TRUE). MESSAGE STRING(JsonString) VIEW-AS ALERT-BOX. END.
W sekcji // Create credentials budowany jest obiekt zawierający nazwę użytkownika i hasło:
oCreds = NEW Credentials(). W tym bardzo prostym przypadku dane są podane w sposób jawny.
Najciekawsze instrukcja to budowa żądania z wymuszeniem uwierzytelnienia.
oRequest = RequestBuilder:GET(oURI):UsingBasicAuthentication(oCreds):Request.
Możecie przetestować ten przykład podając dane poprawne, a potem zmienić nazwę klienta lub hasło.
Efekty widać poniżej:
Dodam tylko, że metod i możliwości obsługi klienta HTTP z poziomu języka ABL jest znacznie więcej. Są np. metody do obsługi nagłówka czy ciasteczek. Może jeszcze o tym napiszę.