HTTPCLient()-Response
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
HTTPCLient()-Response
Hallo,
vor einiger Zeit habe ich ein Programm auf den HTTPClient() umgestellt. Mit Hilfe der XUG-Osnabrück-Jungs hatte ich das ans Laufen bekommen. Und es läuft auch absolut sauber und schnell.
Jetzt muß ich aber auch ein POST-Request machen. Das funktioneirt irgendwie anders als bei GET-Requests. Da bekomme ich als Rückgabe per cRueckgabe := oHc:send() den Response in cRueckgabe rein. Bei POST ist das aber leer. Stattdessen wird das in das oHc-Objekt geschrieben. Aber leider kann ich da nicht drauf zugreifen.
Das hier ist der entsprechende Baum im oHc-Objekt im ObjectInspector:
Eine Abfrage auf oHc:httpresponse gibt mir ein "Result: HttpResponseMessage". Eine Abfrage auf oHc:httpresponse:headers gibt dagegen ein "Membervariable ist für dieses Objekt unbekannt" zurück. Obwohl das im Objektbaum drin steht.
Offensichtlich habe ich da ein massives Verständnisproblem.
Wie also komme ich jetzt an die Response-Daten ran?
Jan
vor einiger Zeit habe ich ein Programm auf den HTTPClient() umgestellt. Mit Hilfe der XUG-Osnabrück-Jungs hatte ich das ans Laufen bekommen. Und es läuft auch absolut sauber und schnell.
Jetzt muß ich aber auch ein POST-Request machen. Das funktioneirt irgendwie anders als bei GET-Requests. Da bekomme ich als Rückgabe per cRueckgabe := oHc:send() den Response in cRueckgabe rein. Bei POST ist das aber leer. Stattdessen wird das in das oHc-Objekt geschrieben. Aber leider kann ich da nicht drauf zugreifen.
Das hier ist der entsprechende Baum im oHc-Objekt im ObjectInspector:
Eine Abfrage auf oHc:httpresponse gibt mir ein "Result: HttpResponseMessage". Eine Abfrage auf oHc:httpresponse:headers gibt dagegen ein "Membervariable ist für dieses Objekt unbekannt" zurück. Obwohl das im Objektbaum drin steht.
Offensichtlich habe ich da ein massives Verständnisproblem.
Wie also komme ich jetzt an die Response-Daten ran?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: HTTPCLient()-Response
Hallo Jan
ich kenne die GET, POST .... Abfragemethoden nur im Zusammenhang mit JavaScript oder xb2net hier ist der Zugriff auf den Inhalt bei beiden Methoden identisch. Der Unterschied der beiden ist ja nur die unbegrenzte Datenlänge bei POST und anderes Verhalten im Browser(unsichtbar, nicht Cache-bar, Bookmark-bar). Wenn du sicher bist dass dein Request korrekt ist und der Server eine korrekte Antwort sendet wendest du dich vermutlich am besten an Alaska. Deren HTTP-Client ist ja noch in Ausbildung...... du hast doch einen heissen Draht zu denen.
Gruss Carlo
ich kenne die GET, POST .... Abfragemethoden nur im Zusammenhang mit JavaScript oder xb2net hier ist der Zugriff auf den Inhalt bei beiden Methoden identisch. Der Unterschied der beiden ist ja nur die unbegrenzte Datenlänge bei POST und anderes Verhalten im Browser(unsichtbar, nicht Cache-bar, Bookmark-bar). Wenn du sicher bist dass dein Request korrekt ist und der Server eine korrekte Antwort sendet wendest du dich vermutlich am besten an Alaska. Deren HTTP-Client ist ja noch in Ausbildung...... du hast doch einen heissen Draht zu denen.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: HTTPCLient()-Response
Hallo Carlo,
bislang habe ich mit RESTfull API per LoadFromUrl() (Version von Phil und Xbase++), Sockets, und HTTPClient() gearbeitet. Wobei LoadFromUrl() in der Alaska-Version inzwischen auch mehr kann als nur GET und POST. Ich benutze ebenfalls HEAD (das kann LoadFromUrl() aber meines Wissens nicht) und DELETE. Ist also mit reinen Alaska-Bordmitteln absolut reibungslos handhabbar.
Ich habe inzwischen festgestellt, das Alaska aus welchem Grund auch immer sehr unterschiedlich mit Rückgaben auf POST-Requests arbeitet. Bei der Anmeldung bei der Datenbank bekomme ich die benötigten Daten (SessionID) als normalen Rückgabewert geliefert, wie auch schon bei GET-Requests gewohnt. Das kann ich dann auslesen als cRueckgabe := oHc:send(). Wenn ich aber umfangreichere Daten sende, die in der Datenbank gespeichert werden sollen, dann bekomme ich nur einen Leerstring zurück. Und die Rückgabe steht in dem Zweig, den ich oben als Screenshot gepostet habe.
Ich bin inzwischen auch dahinter gekommen, wie ich den zumindest teilweise auslesen kann. Das ist oHc:respondmessage:getHeader(). Der wiederum hat dann aber den Nachteil, das ich da einfach nur ein mehrdimensionales Array zurück bekomme, kein DataObject. Und ich kann dieses Array auch nicht in ein DataObject wandeln.
Ich werd in der Tat mal Alaska kontakten, was das alles soll. Ich würde mir das alles einfacher und stringenter vorstellen.
Jan
bislang habe ich mit RESTfull API per LoadFromUrl() (Version von Phil und Xbase++), Sockets, und HTTPClient() gearbeitet. Wobei LoadFromUrl() in der Alaska-Version inzwischen auch mehr kann als nur GET und POST. Ich benutze ebenfalls HEAD (das kann LoadFromUrl() aber meines Wissens nicht) und DELETE. Ist also mit reinen Alaska-Bordmitteln absolut reibungslos handhabbar.
Ich habe inzwischen festgestellt, das Alaska aus welchem Grund auch immer sehr unterschiedlich mit Rückgaben auf POST-Requests arbeitet. Bei der Anmeldung bei der Datenbank bekomme ich die benötigten Daten (SessionID) als normalen Rückgabewert geliefert, wie auch schon bei GET-Requests gewohnt. Das kann ich dann auslesen als cRueckgabe := oHc:send(). Wenn ich aber umfangreichere Daten sende, die in der Datenbank gespeichert werden sollen, dann bekomme ich nur einen Leerstring zurück. Und die Rückgabe steht in dem Zweig, den ich oben als Screenshot gepostet habe.
Ich bin inzwischen auch dahinter gekommen, wie ich den zumindest teilweise auslesen kann. Das ist oHc:respondmessage:getHeader(). Der wiederum hat dann aber den Nachteil, das ich da einfach nur ein mehrdimensionales Array zurück bekomme, kein DataObject. Und ich kann dieses Array auch nicht in ein DataObject wandeln.
Ich werd in der Tat mal Alaska kontakten, was das alles soll. Ich würde mir das alles einfacher und stringenter vorstellen.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: HTTPCLient()-Response
OK. Supportanfrage ist von Alaska sehr schnell beantwortet worden. Oder sollte ich besser sagen, es wurde schnell reagiert?
Grundaussage: Warum zur Hölle (wörtliches Zitat!) ich da keinen Code mitschicken würde. Das ich angeboten hatte, Code zu schicken, aber gehofft hatte, die könnten mir auf Grund der Beschreibung der merkwürdigen und unterschiedlichen Verhaltensweisen einen Hinweis geben, ist vollkommen ignoriert worden.
Außerdem gab es den Hinweis, das HTTPResponse absolut korrekt arbeiten würde. Kein Wort dazu, das ich aber über oHc:httpresponse:header nicht darauf zugreifen kann, und bei Abfrage von oHc:httpresponse:getHeader() einfach nur ein Array kommt, dazu kein Wort.
Das ansonsten es den Hinweis gab, den Statuscode per :getStatusCode() zu beachten, und die Bitte doch die Doku der Schnittstelle mitzuliefern, soll nicht unerwähnt bleiben. Ersteres mache ich selbstverständlich, zweiteres nützt nichts weil das keinen Hinweis gibt, warum eine Antwort in einen Rückgabewert als JSON-String und der andere Rückgabewert in das DataObject überführt wird, auf den inn dem DataObject nicht direkt zugegriffen werden kann und dessen Export kein DataObject ist (ja, das ist jetzt ironisch gemeint!). Wobei ich jetzt mal vermute das die Entwickler der Schnittstelle keine Ahnung davon haben, was Xbase++ ist bzw. die internen Abläufe in DataObjects da nicht kennen.
Keine Ahnung, wer das beantwortet hat. Derjenige/diejenige hielt es für angebracht, keinen Namen darunter zu setzen. Ich bin mir allerdings sehr sicher, das es nicht Till war, der würde sich niemals so ausdrücken - außer der hat irgendwo noch einen Mr. Hyde bei sich, der da ab und an mal vorlugt
Im Moment bin ich jetzt erstmal einfach nur gefrustet.
Zum Glück läuft der Code jetzt ja. Ich habe also nicht das Problem, das ich das ganze Projekt einstampfen müsste. Aber meine Fragen sind halt offen. Und das stört mich.
Jan
Grundaussage: Warum zur Hölle (wörtliches Zitat!) ich da keinen Code mitschicken würde. Das ich angeboten hatte, Code zu schicken, aber gehofft hatte, die könnten mir auf Grund der Beschreibung der merkwürdigen und unterschiedlichen Verhaltensweisen einen Hinweis geben, ist vollkommen ignoriert worden.
Außerdem gab es den Hinweis, das HTTPResponse absolut korrekt arbeiten würde. Kein Wort dazu, das ich aber über oHc:httpresponse:header nicht darauf zugreifen kann, und bei Abfrage von oHc:httpresponse:getHeader() einfach nur ein Array kommt, dazu kein Wort.
Das ansonsten es den Hinweis gab, den Statuscode per :getStatusCode() zu beachten, und die Bitte doch die Doku der Schnittstelle mitzuliefern, soll nicht unerwähnt bleiben. Ersteres mache ich selbstverständlich, zweiteres nützt nichts weil das keinen Hinweis gibt, warum eine Antwort in einen Rückgabewert als JSON-String und der andere Rückgabewert in das DataObject überführt wird, auf den inn dem DataObject nicht direkt zugegriffen werden kann und dessen Export kein DataObject ist (ja, das ist jetzt ironisch gemeint!). Wobei ich jetzt mal vermute das die Entwickler der Schnittstelle keine Ahnung davon haben, was Xbase++ ist bzw. die internen Abläufe in DataObjects da nicht kennen.
Keine Ahnung, wer das beantwortet hat. Derjenige/diejenige hielt es für angebracht, keinen Namen darunter zu setzen. Ich bin mir allerdings sehr sicher, das es nicht Till war, der würde sich niemals so ausdrücken - außer der hat irgendwo noch einen Mr. Hyde bei sich, der da ab und an mal vorlugt
Im Moment bin ich jetzt erstmal einfach nur gefrustet.
Zum Glück läuft der Code jetzt ja. Ich habe also nicht das Problem, das ich das ganze Projekt einstampfen müsste. Aber meine Fragen sind halt offen. Und das stört mich.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Re: HTTPCLient()-Response
Hallo Jan,
nun darf ich mich auch mit HttpClient herunschlagen (Freude), daher kann nicht einschätzen, ob mein Hinweis hilfreich ist.
Ich schicke eine Anfrage und erwarte als Rückgabe einen Json String.
Das sieht bei mir so aus:
So funxt es genauso:
Wenn ich das richtig verstehe, schreibe ich in den Request was ich als Rückgabe erwarte.
Glück Auf!
Udo
nun darf ich mich auch mit HttpClient herunschlagen (Freude), daher kann nicht einschätzen, ob mein Hinweis hilfreich ist.
Ich schicke eine Anfrage und erwarte als Rückgabe einen Json String.
Das sieht bei mir so aus:
Code: Alles auswählen
oHC := HttpClient():new( "https://....." )
oHC:SetAuthorization( cUser, cPW )
oHC:setAcceptType( "application/json" )
xResult := oHC:send()
IF oHC:getStatusCode() == 200 // alles fine
jsResponse := oHC:HttpResponse:getContent()
aoData := Json2Var(jsResponse)
dfmemo("HTTP Request","TEST POST", var2char(jsResponse) )
ELSE
msg("HTTP Fehler "+ str( oHC:getStatusCode() ),"")
ENDIF
Code: Alles auswählen
oHC := HttpClient():new()
oMsg := HttpRequestMessage():new( "https://......")
oMsg:setHeader( "Authorization", "Basic "+ bin2base64(cUser+":"+cPW ))
oMsg:addHeader( "Accept", "application/json")
xResult := oHC:send(oMsg)
...
Wenn ich das richtig verstehe, schreibe ich in den Request was ich als Rückgabe erwarte.
Glück Auf!
Udo
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: HTTPCLient()-Response
Ja, du möchtest vom Server einen JSON String. Dieser kann mit Status 406 "Nicht aktzeptiert" Anworten, einen JSON String oder etwas beliebiges senden. Es ist ein Wunsch, der nicht zwingend erfüllt wird oder werden muss .....
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Re: HTTPCLient()-Response
Hallo Jan
Die Antwort kam sicher von Andreas.
Darum will ich nur noch mit Till sprechen.
Mehr will und möchte ich nicht dazu sagen.
Gruss
Thomas
Die Antwort kam sicher von Andreas.
Darum will ich nur noch mit Till sprechen.
Mehr will und möchte ich nicht dazu sagen.
Gruss
Thomas