AW: post Json mit REST
Hallo Bbommel,
hab ich guck:
Delphi-Quellcode:
Leider kommt: BadRequest. Der Server von denen ist zickig. Kann sein, dass er sich schon an den accept Headern stört.
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; 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: |
AW: post Json mit REST
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
Delphi-Quellcode:
, dann wird der Request als
ctNone
Delphi-Quellcode:
abgeschickt.
ctAPPLICATION_X_WWW_FORM_URLENCODED
Also wäre es geschickt, wenn du den Body so angibst
Delphi-Quellcode:
denn dann wird der wird dieser Request auch mit dem Content-Type application/json abgeschickt.
Req_Update.Params.Clear;
Req_Update.AddBody(JsonString,ctAPPLICATION_JSON); Req_Update.Execute; |
AW: post Json mit REST
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...:-) ) |
AW: post Json mit REST
Zitat:
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:
und als Fehlermeldung kommt in einem HTML-Body zurück:
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 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
Delphi-Quellcode:
und die Proterty auf "application/x-www-form-urlencoded" dann ist der Server zufrieden.
sResponse:=NetHTTPRequest1.Post(BaseURL+'XXXURL',jsonToSend);
In Wireshark sieht man, dass alle Header bis auf Content-Type fehlen:
Code:
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.
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: Vielen Dank für den Input von euch. Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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