Laden...

https Web Request c# und Postman

Erstellt von grosser13 vor 2 Jahren Letzter Beitrag vor 2 Jahren 1.294 Views
G
grosser13 Themenstarter:in
2 Beiträge seit 2021
vor 2 Jahren
https Web Request c# und Postman

Hallo Leute,

vielleicht kann mir jemand helfen. Ich entwickle gerade einen Client zur Kommunikation mit einem Server. Ich habe die Requests (GET und PATCH) mit Postman getestet und sie laufen einwandfrei. Wenn ich jetzt aus Postman den Code exportiere, dann funktionieren die GET Requests einwandfrei, die PATCH Requests allerdings bleiben beim getResponse einfach hängen und es kommt dann nach dem eingestellten Timeout die Timeout exception. Ich habe dann versucht die Requests ohne Restsharp selber zu entwickeln. Selbes Ergebnis GET geht PATCH nicht. Was läuft hier falsch??

Hier der GET Befehl von Postman exportiert:


var client = new RestClient("https://192.168.10.12/Service.dll/v2/order");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("api_key", "XXXXXXXXXXXXXX");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Hier der PATCH Befehl von Postman exportiert:


var client = new RestClient("https://192.168.10.12/Service.dll/v2/order");
client.Timeout = -1;
var request = new RestRequest(Method.PATCH);
request.AddHeader("api_key", "XXXXXXXXXXXXXX");
request.AddHeader("Content-Type", "text/plain");
var body = @"{" + "\n" +
@"    ""status"": ""attended""" + "\n" +
@"}";
request.AddParameter("text/plain", body,  ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Ich bin gerade am verzweifeln .... Websuche hat bislang auch nichts gebracht.

Danke schon mal

2.080 Beiträge seit 2012
vor 2 Jahren

So habe ich das noch nie versucht, was das Problem sein könnte, kann ich dir daher nicht sagen.

Ich habe aber ein paar REST-Clients mit Refit umgesetzt, damit ist es super einfach und schnell gemacht.
Einen Export dahin gibt's aber nicht, doch GET bzw. PATCH und den API-Key einzustellen ist ziemlich simpel.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.841 Beiträge seit 2008
vor 2 Jahren

Punkt 1: Refit ist 94873284 mal besser, einfacher und stabiler als RestClient.
Punkt 2: generierter Code ist immer so ne Sache... gerade bei Postman. Es ist immer besser wenn man versteht, was man macht.

Zum Code:
Du hast nen Json Body, aber text/plain - sicher, dass das die API so annimmt und so korrekt für den Export ist?
Ob das valide ist, musst Du den API Owner fragen, der weiß, ob text/plain akzeptiert wird. Weit verbreitet wäre es bei einer Json API, dass nur application/json akzeptiert wird.

G
grosser13 Themenstarter:in
2 Beiträge seit 2021
vor 2 Jahren

Hi danke erst mal für die Antworten.

ich hab mich in die Materie eingelesen insofern bin ich zwar kein meister, aber kann mir die Zusammenhänge recht gut erklären. Das mit dem text/plain habe ich anhand von Postman so eingestellt, aber natürlich auch mit application/json versucht, das war einer meiner ersten Gedanken. Sowohl im exportierten als auch im eigen geschriebenen. Was mich wundert, ist dass mein programm bei getResponse einfach hängen bleibt wie wenn etwas fehlen würde im Request, und noch kein Response erstellt werden kann. Bei Postman passiert das nicht, also muss er etwas anderes senden als der Request aus c# im Visual Studio.... aber ich finde keinen Anhaltspunkt was das sein könnte. Was ich noch vergessen habe zu erwähnen ist, dass ich die ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; benutzen musste, da ich das Zertifikat der Maschine nicht validieren kann. Aber das hat Postman beim ersten mal auch bemerkt und gefragt ob er's abschalten soll.

16.841 Beiträge seit 2008
vor 2 Jahren

Bei Postman passiert das nicht, also muss er etwas anderes senden als der Request aus c# im Visual Studio....

Das ist eine falsche Schlussfolgerung.
Die Reaktion einer Anwendung hat nichts mit dem zutun, was über den Kanal gesendet / empfangen wird.

Du kannst Tools wie Fiddler verwenden, um zu schauen, was über den Kanal geht.
Aber wie gesagt: mit dem Verhalten einer Anwendung hat das nichts zutun. Das ist nicht vergleichbar.

da ich das Zertifikat der Maschine nicht validieren kann.

Man kann ein Zertifikat immer validieren; spätestens mit einer manuellen Allow List.
Pauschal jedes Zertifikat anzunehmen ist ein sehr unsauberer Workaround, der auch riskant sein kann.
Wenn Du aber jedes Zertifikat ignorierst, kann ein ungültiges Zertifikat zumindest nicht der Auslöser sein.

Was sagt Dein Debugging?

Timeout kannste ja nicht abfangen, weil -1.
Könnte aber eine Ursache sein. Kann man halt nur testen, wenn man auch ein Timeout hat.

2.080 Beiträge seit 2012
vor 2 Jahren

Was mich wundert, ist dass mein programm bei getResponse einfach hängen bleibt

Für mich klingt das danach, dass die API nicht antwortet. Wenn Du einen Timeout einstellst, würdest Du vermutlich eine TimeoutException bekommen.
Woran das nun genau liegt, kann dir der Entwickler der API am besten sagen - oder Du vergleichst mit Fiddler.

Du könntest auch Mal den curl-Befehl testen, den kann Postman meines auch anbieten. Oder direkt die HTTP-Daten - findest Du alles rechts im "Code snippet"-Bereich.
Und teste es doch mal mit Refit, vielleicht macht RestSharp hier irgendetwas unter der Haube, "verkauft" es als Default-Verhalten und tritt dir damit ans Bein.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.