AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

post Json mit REST

Ein Thema von mikel.pahl · begonnen am 22. Okt 2018 · letzter Beitrag vom 5. Nov 2018
Antwort Antwort
Seite 2 von 2     12   
mikel.pahl

Registriert seit: 21. Sep 2015
Ort: Karlsruhe Neureut
5 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: post Json mit REST

  Alt 31. Okt 2018, 09:57
Hallo Bbommel,

hab ich guck:
Delphi-Quellcode:
procedure TFormRESTTest.BtnRestAbwertenClick(Sender: TObject);
var
  jValue, jApixResponse: TJSONValue;
  jUpdates: TJSONArray;
  hash : system.hash.THashSHA2;
  Ammount, JsonString: string;

begin
  memo.Clear;
  Ammount:='-'+EDBetrag.Text;
  if (AccountID<>'') and (AccountID<>'keine Karte') then
  begin
    JsonString:=JsonUpate(Ammount,AccountID,Sale);
    Memo.lines.Add('-> '+JsonString);
    Req_Update.Params.Clear;
    Req_Update.AddBody(JsonString,ctNone);
    Req_Update.Execute;
    if Res_Update.StatusCode = 200 then
    begin
      jValue:=Res_Update.JSONValue;
      Memo.lines.Add('<- '+ jValue.ToString);
      jApixResponse:=jValue.GetValue<TJSONObject>('ApixResponse');
      AccountInfo.AccountStatus:=jApixResponse.GetValue<Integer>('Status');
      ......
    end
    else
    begin
      ShowMessage('Fehler :'+inttostr(Res_Update.StatusCode));
      Memo.lines.Add('<- '+ Res_Update.Content);
    end;
  end;
end;
Leider kommt: BadRequest. Der Server von denen ist zickig. Kann sein, dass er sich schon an den accept Headern stört.
Mit Req_Update.AddBody(JsonString,ctAPPLICATION_JSON); gehts auch nicht, da der Server den ContentType schon garnicht mag.

Wireshark erkennt auch das Json nicht richtig; sieht es so aus:
Code:
Hypertext Transfer Protocol
    POST /ApiXRest/RestAPI/AccountPurses HTTP/1.1\r\n
    Connection: Keep-Alive\r\n
    Content-Type: application/x-www-form-urlencoded\r\n
    Accept: application/json, text/plain; q=0.9, text/html;q=0.8,\r\n
    Accept-Charset: UTF-8, *;q=0.8\r\n
    User-Agent: Embarcadero RESTClient/1.0\r\n
    Content-Length: 580\r\n
    Host: api.countersolutions.com\r\n
    \r\n
    [Full request URI: http://api.countersolutions.com/ApiXRest/XXXXX/XXXXXX]
    [HTTP request 1/1]
    [Response in frame: 9]
    File Data: 580 bytes
HTML Form URL Encoded: application/x-www-form-urlencoded
    Form item: "{"ApiXRequest":{"Hash":"b4909261182c6321d88e5e97dd53564bc7d9fa33fa809b61fd7ff3dda44428c5",".......
        Key [truncated]: {"ApiXRequest":{"Hash":"b4909261182c6321d88e5e97dd53564bc7d9fa33fa809b61fd7ff3dda44428c5",......
        Value:
Michael Pahl
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#12

AW: post Json mit REST

  Alt 31. Okt 2018, 10:12
Der Server ist nicht zickig, sondern erwartet ein application/json.
Du schickst ihm aber ein application/x-www-form-urlencoded.

Das ist so wie mit den Birnen und den Äpfel.

UPDATE Ok, ich will dann mal lösen ...

Wenn du nichts angibst ctNone , dann wird der Request als ctAPPLICATION_X_WWW_FORM_URLENCODED abgeschickt.

Also wäre es geschickt, wenn du den Body so angibst
Delphi-Quellcode:
    Req_Update.Params.Clear;
    Req_Update.AddBody(JsonString,ctAPPLICATION_JSON);
    Req_Update.Execute;
denn dann wird der wird dieser Request auch mit dem Content-Type application/json abgeschickt.

Geändert von Schokohase (31. Okt 2018 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
648 Beiträge
 
Delphi 12 Athens
 
#13

AW: post Json mit REST

  Alt 31. Okt 2018, 13:01
Hmh, das mit dem "AddBody(JsonString,ctAPPLICATION_JSON)" hätte ich jetzt auch als Problem noch mal erwähnt (stand z.B. in meinem ersten Post auch so).

Michael schreibt aber ja, dass er es auch damit probiert hat und es damit dennoch auch nicht geht. @Michael: Was sagt denn Wireshark in dem Fall?

Als ich mich selbst erstmals mit dem Posten mit dem RestRequest beschäftigt hatte, hatte ich ähnliche Probleme. Das lag aber letztlich daran, dass der Server hier als eine Variante einen sehr, sehr speziellen Content-Type haben wollte, den ich gerne genutzt hätte. Das unterstützt der RestRequest aber nicht und somit bin ich dann auch immer beim "x-www-form" gelandet. Sobald ich dann aber beschlossen habe, das ganz normale JSON zu nutzen und das auch so wie geschrieben im Body gesetz habe, war auch der Content-Type im HHTP-Header korrekt.

Insofern würde mich wundern, wenn der Header auch mit dem "AddBody(JsonString,ctAPPLICATION_JSON)" noch immer falsch aussehen würde und Wireshark das JSON nicht erkennen würde.

(Ich meine, letztlich hast du ja mit dem Ansatz von Schokohase eine funktionierende Lösung, aber eigentlich sollte es halt auch so problemlos laufen... )
  Mit Zitat antworten Zitat
mikel.pahl

Registriert seit: 21. Sep 2015
Ort: Karlsruhe Neureut
5 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

AW: post Json mit REST

  Alt 5. Nov 2018, 13:09
Der Server ist nicht zickig, sondern erwartet ein application/json.
Du schickst ihm aber ein application/x-www-form-urlencoded.
Hallo Schokohase und BBommel,

es ist wohl leider so, dass der Server als ContentType nur nix oder application/x-www-form-urlencoded akzeptiert. Im Demoprogramm von denen war es auch mit "application/x-www-form-urlencoded".
Wenn Wireshark das Jsonobject erkennt gehts beim Server nicht. Das ist widersinnig aber ich kann es nicht ändern. Von der Theorie her habt ihr Recht aber der Server hält sich nicht dran.

Wenn ich das mit der RESTKomponten - wie gerade eben von Schokohase beschrieben - mache
- mit ctnone kommt 'Invalid JSON primitive:

- mit ctAPPLICATION_JSON sieht in Wireshark so aus:
Code:
Frame 8: 416 bytes on wire (3328 bits), 416 bytes captured (3328 bits) on interface 0
Ethernet II, Src: WistronI_bc:19:16 (3c:97:0e:bc:19:16), Dst: Cisco_27:f3:80 (00:26:0a:27:f3:80)
Internet Protocol Version 4, Src: 10.203.40.2, Dst: 148.253.138.2
Transmission Control Protocol, Src Port: 56837, Dst Port: 80, Seq: 294, Ack: 1, Len: 362
[2 Reassembled TCP Segments (655 bytes): #7(293), #8(362)]
Hypertext Transfer Protocol
    POST /ApiXRest/RestAPI/AccountPurses HTTP/1.1\r\n
    Connection: Keep-Alive\r\n
    Content-Type: application/json\r\n
    Accept: application/json, text/plain; q=0.9, text/html;q=0.8,\r\n
    Accept-Charset: UTF-8, *;q=0.8\r\n
    User-Agent: Embarcadero RESTClient/1.0\r\n
    Content-Length: 362\r\n
    Host: api.countersolutions.com\r\n
    \r\n
    [Full request URI: http://api.countersolutions.com/ApiXRest/RestAPI/xxxxx]
    [HTTP request 1/1]
    [Response in frame: 15]
    File Data: 362 bytes
JavaScript Object Notation: application/json
und als Fehlermeldung kommt in einem HTML-Body zurück:
The exception message is 'Incoming message for operation 'UpdateAccountPurse' (contract 'IRestAPI' with namespace 'http://tempuri.org/') contains an unrecognized http body format value 'Json'. The expected body format value is 'Raw'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details.'


Mit
sResponse:=NetHTTPRequest1.Post(BaseURL+'XXXURL',jsonToSend); und die Proterty auf "application/x-www-form-urlencoded" dann ist der Server zufrieden.
In Wireshark sieht man, dass alle Header bis auf Content-Type fehlen:
Code:
Frame 5: 416 bytes on wire (3328 bits), 416 bytes captured (3328 bits) on interface 0
Ethernet II, Src: WistronI_bc:19:16 (3c:97:0e:bc:19:16), Dst: Cisco_27:f3:80 (00:26:0a:27:f3:80)
Internet Protocol Version 4, Src: 10.203.40.2, Dst: 148.253.138.2
Transmission Control Protocol, Src Port: 55896, Dst Port: 80, Seq: 216, Ack: 1, Len: 362
[2 Reassembled TCP Segments (577 bytes): #4(215), #5(362)]
Hypertext Transfer Protocol
    POST /ApiXRest/RestAPI/AccountPurses HTTP/1.1\r\n
    Connection: Keep-Alive\r\n
    Content-Type: application/x-www-form-urlencoded\r\n
    User-Agent: Embarcadero URI Client/1.0\r\n
    Content-Length: 362\r\n
    Host: api.countersolutions.com\r\n
    \r\n
    [Full request URI: http://api.countersolutions.com/ApiXRest/RestAPI/AccountPurses]
    [HTTP request 1/2]
    [Response in frame: 8]
    [Next request in frame: 11]
    File Data: 362 bytes
HTML Form URL Encoded: application/x-www-form-urlencoded
    Form item: "{"ApiXRequest":{"Hash":"067697798a41bfa6ff2d60f75ca2ca9d987e87010228b9640f288b59795fb3c6","BusinessID":"14","CustomerID":"129","SiteID":"1","LocationID":"40","DeviceID":"206","MessageNumber":"1050","UTC":"2018-11-02T12:04:10Z",
        Key [truncated]: {"ApiXRequest":{"Hash":"067697798a41bfa6ff2d60f75ca2ca9d987e87010228b9640f288b59795fb3c6","BusinessID":"14","CustomerID":"129","SiteID":"1","LocationID":"40","DeviceID":"206","MessageNumber":"1050","UTC":"2018-11-02T12:04
        Value:
So ein Request ohne Header bekomme ich mit der Restkomponten von Delphi nicht hin. Muss auch nicht. Ich bin mit der Lösung so glücklich.

Vielen Dank für den Input von euch.

Michael
Michael Pahl
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:11 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