HTTPCLient()-Response

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

HTTPCLient()-Response

Beitrag 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) 7006 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPCLient()-Response

Beitrag 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
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPCLient()-Response

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPCLient()-Response

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Udo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Do, 18. Okt 2007 15:37

Re: HTTPCLient()-Response

Beitrag 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
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPCLient()-Response

Beitrag 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 .....
Valar Morghulis

Gruss Carlo
Benutzeravatar
Muecke
1000 working lines a day
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

Beitrag 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
Antworten