Ankündigung

Einklappen
Keine Ankündigung bisher.

g_json liefert null statt Fehlerantwort von Webservice

Einklappen
X

g_json liefert null statt Fehlerantwort von Webservice

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • g_json liefert null statt Fehlerantwort von Webservice

    Hallo,
    ich möchte einen Webservice eines externen Anbieters (mQuest von Cluetec) anbinden.
    Im großen und ganzen Funktioniert das ganze auch. Wenn ich eine positive Rückmeldung von mQuest bekomme kann ich das Ergebnis auch verarbeiten.
    Um aber ein Fehlerhandling einzubauen habe ich nun mal bewusst einen Fehler provoziert (Ich rufe einen Datensatz mit einer ID ab die es nicht gibt). Wenn ich die URL im Browser aufrufe bekomme ich auch eine saube Antwort als JSON:
    Code:
    {"code":4005,"message":"The result with the id [666] for the questionnaire [QS_Endabnahme] does not exist"}
    Rufe ich die selbe URL per Groovy-Befehl auf bekommei ich null als Antwort.
    Hier der Aufruf:
    Code:
    g_json.httpGet(url: uri, readTimeout: 20000)
    Warum liefert mir Intrexx nicht das selbe JSON wie der Browser?

    Ich habe übrigens die URI in Groovy mit dem URIBuilder zusammengesetzt, anschließend gelogt und dann verwendet. Die gelogte URL habe ich dann in den Browser eingefügt.

  • #2
    Hat die Nachricht auch einen HTTP-Status-Code? Evtl. liegt es daran?
    Also mit den aktuellen Infos kann ich nur ins Blaue raten.
    Ich weis bspw. auch nicht an welcher Stelle du prüfst.
    Evtl. prüfst du was bei einem AJAX-Call im JS zurückkommt und hast aber im Groovy ein try-catch-Konstrukt welches dafür sorgt, dass alles was nicht richtig ist abgewürgt wird?

    Kommentar


    • #3
      Hallo MartinW,

      vielen Dank für deine Antwort. Bitte Entschuldige die fehlenden Informationen.
      Ich befinde ich mich in einem Workflow in einer Groovy-Aktion. Es findet keine Interaktion mit dem Frontend statt, also kein JavaScript.
      Ich frage aktuell nur mit httpGet ab und schreibe das Ergebnis in eine Log-Datei.
      Die Nachricht ist zum Glück sehr gut Dokumentiert und hat für Fehler verschiedene Status-Codes. Hier der Link zur Beschreibung:
      https://apidoc-qs3.mquest.de/#operation/getResultById

      Hier mal die Funktion translateJSON welche ich aufrufe (geklaut aus den Tips&Tricks:
      Code:
      def translateJson(key, iIdErgebnis)
      {
      URI uri = new URIBuilder()
      .setScheme("https")
      .setHost("xxx.mquest.de")
      .setPath("qs/xxxxx/api/v1/projects/XXXXXXXX/results/" + iIdErgebnis.toString())
      .setParameter("api_key", key)
      /*.setParameter("format", "json")
      .setParameter("version", v1)
      .setParameter("projectName", "QS_Endabnahme")
      .setParameter("split_sentences", "1")
      .setParameter("preserve_formatting", "1")*/
      .build();
      g_log.info("URI: " + uri)
      
      
      g_json.httpGet(url: uri, readTimeout: 20000)
      }
      Ich habe hier fürs Forum ein paar Werte durch pseudo-Werte(X) ersetzt. Wie gesagt, die fertige URL bringt im Browser das erwartete Ergebnis.

      Kommentar


      • #4
        Und wie genau sieht deine Prüfung für das Ergebnis von httpGet aus?
        Dafür bräuchtest du hier noch ein g_log.
        Falls du die Rückgabe der translateJson Methode loggst, müsstest du das Ergebnis von httpGet per return zurückgeben.

        Kommentar


        • #5
          Hier der Funktionsaufruf und die Log-Ausgabe:
          Code:
          //Ergebnis von mQuest abfrufen
          Ergebnisse = translateJson(key, iIdErgebnis)
          
          g_log.info(Ergebnisse)

          Kommentar


          • #6
            versuch mal anstatt
            Code:
              g_log.info("URI: " + uri)
              g_json.httpGet(url: uri, readTimeout: 20000)
            }
            Das hier:
            Code:
              g_log.info("URI: " + uri)
              return g_json.httpGet(url: uri, readTimeout: 20000)
            }

            Kommentar


            • #7
              Leider kein Erfolg. Ich bekomme wieder null zurück.

              Kommentar


              • #8
                was mich auch etwas irritiert ist die Parametrisierung von httpGet. warum nicht einfach httpGet(uri, 20000)?

                Kommentar


                • #9
                  Danke, das fand ich auch etwas Merkwürdig aber es hat ja funktioniert...
                  Ich habe das nun einfach mal so gemacht wie du es geschrieben hast, leider bekomme ich dann sofort eine Fehlermeldung:
                  de.uplanet.lucy.server.workflow.WorkflowException: groovy.lang.MissingMethodException: No signature of method: de.uplanet.lucy.server.scripting.groovy.json.Groov yJSON.httpGet() is applicable for argument types: (URI, Integer) values: [https://xxxx.mquest.de/qs/xxxxxx/api...i_key=xxxxxxxx, ...]

                  Kommentar


                  • #10
                    OK habe jetzt herausgefunden was es damit auf sich hat. Tricky.
                    In der doku gibt es eine Variante der Methode, die eine Map an Parametern erwartet: http://docs.intrexx.com/intrexx/vers...roovyJSON.html

                    Die schreibweise in deinem Code erzeugt quasi in den Klammern diese Map und übergibt sie der Methode.

                    Kommentar


                    • #11
                      Das Kontextobjekt g_json kannte ich bisher gar nicht. Versuchs doch mal testweise mit dem JsonSlurper:

                      Code:
                      import groovy.json.JsonSlurper
                      ...
                      return new JsonSlurper().parse(uri.toURL())
                      ...

                      Kommentar

                      Lädt...
                      X