Seite 1 von 1

HTTPCLient()-Response

Verfasst: Sa, 21. Jul 2018 20:16
von Jan
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:
ObjectInspector.jpg
ObjectInspector.jpg (162.93 KiB) 7066 mal betrachtet
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

Re: HTTPCLient()-Response

Verfasst: So, 22. Jul 2018 17:19
von ramses
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

Re: HTTPCLient()-Response

Verfasst: Mo, 23. Jul 2018 9:08
von Jan
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

Re: HTTPCLient()-Response

Verfasst: Mo, 23. Jul 2018 12:01
von Jan
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

Re: HTTPCLient()-Response

Verfasst: Di, 02. Jul 2019 17:05
von Udo
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:

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
So funxt es genauso:

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

Re: HTTPCLient()-Response

Verfasst: Mi, 03. Jul 2019 14:09
von ramses
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 .....

Re: HTTPCLient()-Response

Verfasst: Do, 04. Jul 2019 6:38
von Muecke
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