Laden...

Wie kann ich eine Http API mit Auth Testbar machen?

Erstellt von Chronos vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.072 Views
C
Chronos Themenstarter:in
132 Beiträge seit 2008
vor 4 Jahren
Wie kann ich eine Http API mit Auth Testbar machen?

Hallo,

zunächst einmal, gegoogelt habe ich nach meine Fragestellung aber konkret finden konnte ich dazu bisher nix.

Ich versuche gerade mittels Http(Client|MessageHandler) eine API umzusetzen.
Sinn ist es mittels Digest Auth auf einem Server per SSL Daten abzufragen.
Das funktioniert auch schon.

Ich mache mir nun Gedanken darüber wie man die implementierten Clients UnitTestbar machen kann.
Erster Gedanke war das per HttpMessageHandler zu realisieren der im Konstruktor eines jeden Clients mitgegeben wird (evtl. auch mit Credentials).
Würde soweit auch funktionieren.
In Tests habe ich aber festgestellt das im funktionalen Einsatz unter Realbedingungen es so ist das für jede Abfrage auch automatisch eine neue Anmeldung am Server gemacht wird.
Ich wäre davon ausgegangen das dies nur beim ersten Request passieren würde und für jeden weiteren Request dann nicht mehr, da der Händler für jeden Request der selbe ist.

Jetzt bin ich beim Lesen auf den Hinweis gestoßen das man einen HttpClient am besten static haben sollte.
Drum dachte ich mir das der Client evtl. irgendwelche Sessions oder ähnliches zwischenspeichert von denen er ausgehen könnte nach der ersten Anmeldung wäre keine weiter mehr notwendig.
Aber auch bei der Implementierung mit einem static HttpClient zeichnet sich das selbe Bild ab.

Jetzt ist für mich die Frage:

#1: Ist das in diesem Fall evtl. die Implementierung/Handling am Server die/das die Auth nicht über Requests hinweg funktioniert lässt.
#2: Wenn das so ist kann ich in diesem Fall nichts daran ändern, aber um spätere größere Änderungen zu vermeiden wäre meine Frage was besser wäre?

Für jede Aktion auf der C# API einen Client oder einen Handler mitzugeben auf dem die Requests gemacht werden?
Bauchgefühl sagt Handler wegen der Testbarkeit.
Nur kann ich aufgrund mangelnder Erfahrung mit HTTP nicht abschätzen ob es equivalent wäre einen Handler oder Client mitzugeben, gerade im Bezug auf das Führen von möglichen Sessions.
Was meint ihr?

16.807 Beiträge seit 2008
vor 4 Jahren

Jetzt bin ich beim Lesen auf den Hinweis gestoßen das man einen HttpClient am besten static haben sollte.

Wurde da wirklich "static" gesagt? Wenn ja ist das sehr unglücklich formuliert. Davon abgesehen war schon immer der korrekte Weg HttpClient komplett zu abstrahieren.
Das Problem von HttpClient ist, dass dieser Ressourcen benötigt und das Initialisieren langsam ist. Deswegen gibt es mittlerweile auch die HttpClientFactory, die das Management übernimmt.
Use HttpClientFactory to implement resilient HTTP requests Selbst initialisieren solltest am Besten lassen, wenn möglich.

Man versucht eben den HttpClient pro Endpunkt (im Sinne von API) nur einmal zu erstellen; kann aber ebenso in einem Singleton sein und eben nicht mit dem magic static.

Wenn Du ein API Client schreibst, dann empfehle ich Dir Refit

Damit kannst Du den Client problemlos mocken und Unit-fähig umsetzen.
Der Rest wird auch in Refit unterstützt und ist gut dokumentiert.