Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Rest post (https://www.delphipraxis.net/202528-rest-post.html)

Graw 14. Nov 2019 07:34

Rest post
 
Guten Morgen,

ich habe mein erstes Projekt bei dem ich mit einem Webservice arbeite.
Hier ist es so, dass über ein GET eine Nonce abgefragt werden muss.
Mit dieser Nonce im Header können dann mit POST Daten an den Webservice geschickt werden.
Derzeit bin ich soweit, das ich mit GET die Nonce vom Webservice erfolgreich abfragen kann.
Nun scheitere ich derzeit daran mit POST Daten an sen Service zu senden.

Hier mein POST mit der Nonce im Header:

Code:
procedure TForm1.ButtonClick(Sender: TObject);
begin
  RESTRequest.Params.AddHeader('Nonce',Nonce);
  RESTRequest.Params.AddHeader('Content-Type', 'application/json');
  RESTRequest.AddBody('{"Test"}');
  RESTRequest.Execute;
end;
URL, Methode und Authentifizierung wurden im REST Debugger angegeben.

Als Fehlermeldung kommt immer das das Zeitlimit überschritten wurde.

Schon einmal vielen Dank.

DeddyH 14. Nov 2019 07:43

AW: Rest post
 
Hast Du auch die HTTP-Methode umgestellt?
Delphi-Quellcode:
RESTRequest.Method := rmPost;

Graw 14. Nov 2019 08:08

AW: Rest post
 
Ja,

ich habe mit dem Rest Debugger ein Request für GET und ein Request für POST angelegt.
Den ersten Request nutze ich um die Nonce mit GET abzufragen.
Den zweiten Request für den POST.

DeddyH 14. Nov 2019 08:35

AW: Rest post
 
Ich sehe gerade: Dein Body enthält kein gültiges JSON. Es muss immer der Schlüsselname in Anführungszeichen gefolgt von einem Doppelpunkt und dann der Wert darin stehen. Z.B.:
Code:
{"Test": "test", "NochnTest": 42}

Rolf Frei 14. Nov 2019 10:42

AW: Rest post
 
Da er ein Timeout bekommt, würde ich mal eher auf eine falsche URL tippen. Zwar ist das Korrekt, dass sein Code keine JSON ist, aber da müsste doch dann irgend ein vernünftiger Fehler vom Server kommen.

Graw 14. Nov 2019 13:05

AW: Rest post
 
Vielen Dank für den Hinweis.
Manchmal muss man einfach noch einmal darauf gebracht werden genauer hin zu schauen.
Ich hatte einen Fehler in der URL.

Nun kommt keine Fehlermeldung, allerdings kommen auch noch keine Daten an. (Format vom Body sollte richtig sein. Hatte es hier im Forum nur abgekürzt.)

Wie kann ich eine Meldung bzw. Antwort des Webservices anzeigen?

Rolf Frei 14. Nov 2019 13:15

AW: Rest post
 
Ich kenne mich mit TRESTRequest jetzt nicht so gut aus, aber wenn ich die Doku lese müsstest du die vom Server erhaltene Response in RESTRequest.Response haben:

RESTRequest.Response.JSONText

Graw 16. Dez 2019 08:17

AW: Rest post
 
Hallo,

vielen dank für eure Antworten.
Nun habe ich wieder Zeit mih mit dem Thema zu beschäftigen.
Es it weiterhin so, dass ich die Daten nicht am Webservice empfange.
Besteht die Möglichkeit zu sehen was ich an den Webservice schicke?
Ich würde mir gerne mit showMessage den JSON String anschauen.

Danke.

Neutral General 16. Dez 2019 09:59

AW: Rest post
 
Falls du Komponenten auf dem Form hast und die nicht dynamisch erstellst dann erstellst du sie natürlich hier nicht mehr.
Ansonsten hab ich jetzt das Freigeben weggelassen - das muss natürlich in den echten Code rein.
Letztendlich brauchst du ein TRESTResponse Objekt dass du dem Request zuweist.
Nach dem Execute kannst du dann per response.Content auf den Content zugreifen.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var RESTClient: TRESTClient;
    RESTRequest: TRESTRequest;
    RESTResponse: TRESTResponse;
begin
  RESTClient := TRESTClient.Create(nil);
  RESTClient.BaseURL := '<BaseUrl>';

  RESTResponse := TRESTResponse.Create(nil);

  RESTRequest := TRESTRequest.Create(nil);
  RESTRequest.Client := RESTClient;
  RESTRequest.Response := RESTResponse;
  RESTRequest.Params.AddHeader('Nonce', Nonce);
  RESTRequest.Params.AddHeader('Content-Type', 'application/json');
  RESTRequest.AddBody('{"Test"}');
  RESTRequest.Execute;

  if RESTResponse.Status.Success then
    ShowMessage(RESTResponse.Content);
end;

Graw 18. Dez 2019 08:34

AW: Rest post
 
Hallo,

das hilft mir schonmal in soweit das ich denke den Aufbau richtig zu haben.
Leider kann ich weiterhin keine Daten zum Webservice schicken.
Ich nutze eine Session um die Nonce abzufragen und eine weitere um den POST durchzuführen.
Muss ich beides mit einer Session durchführen?
Wenn ja, wie kann ich die Methode von Get auf Post ändern?

RESTRequest2.Method :=rmPOST; funktioniert nicht. rmPost wird rot unterstrichen. Undeclared identifier 'rmPost'.

Klaus01 18. Dez 2019 08:44

AW: Rest post
 
.. hast Du die Unit REST.Types eingebunden?

Grüße
Klaus

Graw 18. Dez 2019 10:01

AW: Rest post
 
Ne hatte ich nicht :) Danke

Kann ich einen Dummy Webservice aufbauen mit dem ich meinen POST testen kann?
Derzeit schicke ich die Anwendung weg und lasse diese testen.

Neutral General 18. Dez 2019 10:34

AW: Rest post
 
Jo. Brauchst letztendlich nicht viel mehr als einen HTTP Server der dir die eingehenden Anfragen anzeigt. (Falls du nur gucken willst obs richtig ankommt)

mkinzler 18. Dez 2019 11:00

AW: Rest post
 
Es gibt diverse Rest-Framework für Delphi:
https://github.com/synopse/mORMot
https://github.com/danieleteti/delphimvcframework
https://github.com/andrea-magni/MARS
https://github.com/delphi-blocks/WiRL
https://github.com/chapmanworld/deRest
https://github.com/EtheaDev/kitto2

Graw 19. Dez 2019 06:56

AW: Rest post
 
Das Problem scheint zu sein das UTF-8 nicht funktioniert.
Hier jemand eine Idee?

Hier der Post mit Delphi:

Content-Type: application%2Fjson, application/json
Accept: application/json, text/plain; q=0.9, text/html;q=0.8,
Accept-Charset: UTF-8, *;q=0.8
Accept-Encoding: gzip%2Cdeflate
Authorization: Basic aW1wb3J0ZXI6cHRj
Cookie: JSESSIONID=4F0537539F72A8EC707962C592C98D1E.slave3-tomcat1; JSESSIONID=0EC22E31203BE4E6D03B29171BD44BA7.slave3-tomcat1
User-Agent: Embarcadero RESTClient/1.0
CSRF_NONCE: oNEYdo%2BqZGflvntl2bxNT77uPlaR3C02%2BbtKL9X%2BElWX2xQhmJYpR%2FjaKgq1xDZV1L18Eu7QJVrfj 05SluchRbueUVXdikFK7rZvXbqfKhOA2hJT5oZTMrz4FB%2BSg 0Y%3D
Connection: Keep-Alive
Content-Length: 100



Mit Postman

cache-control: no-cache
Postman-Token: f0e8cb0a-ad16-412a-aeef-7e3664d3f511
CSRF_NONCE: oNEYdo+qZGflvntl2bxNT77uPlaR3C02+btKL9X+ElWX2xQhmJYpR/jaKgq1xDZV1L18Eu7QJVrfj05SluchRbueUVXdikFK7rZvXbqf KhOA2hJT5oZTMrz4FB+Sg0Y=
Content-Type: application/json
Authorization: Basic aW1wb3J0ZXI6cHRj
User-Agent: PostmanRuntime/6.4.1
Accept: */*
Host: uwko32:18086
cookie: JSESSIONID=F373A51C00EE6D66DD23E99AF496F74D.slave3-tomcat1
accept-encoding: gzip, deflate
content-length: 100
Connection: keep-alive

Neutral General 19. Dez 2019 09:32

AW: Rest post
 
Probier mal alle Parameter stattdessen so hinzuzufügen:
Delphi-Quellcode:
RESTRequest.AddParameter('Nonce', Nonce, pkHTTPHEADER, [poDoNotEncode]); // Alle anderen auch so

Das poDoNotEncoode ist das ausschlaggebende.

Graw 23. Dez 2019 08:30

AW: Rest post
 
guten Morgen,

das hat sehr gut geklappt.
Nun habe ich nur noch das Problem mit dem Zeichensdatz beim Body.
Wie muss ich das da machen?

Graw 23. Dez 2019 09:57

AW: Rest post
 
Hat geklappt mit:

Code:
RESTRequest.AddParameter('Body', '{"Test"}, pkREQUESTBODY, [poDoNotEncode]);
Vielen Dank an alle die mir hier geholfen haben.
Ich frage mich immer wieder wie ich an diese Information gekommen wäre wenn ich die Fragen nich in diesem Forum stellen könnte.

Wie kommt man sonst an diese Informationen?
Wieso funktioniert die REST Komponente nicht einfach mit den Funktionen:
RESTRequest.Body.Add,
RESTRequest.AddBody
oder
RESTRequest.Params.AddHeader?

Neutral General 23. Dez 2019 10:00

AW: Rest post
 
Also das Problem mit den Parametern kenn ich, aber mit RESTRequest.AddBody hatte ich persönlich noch nie ein Problem.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz