[NEWSboard IBMi Forum]
  1. #1
    KM ist offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    994

    Webservices über Axis-Tools aufrufen

    Hallo,

    hat zufällig schon mal jemand von Euch über die Axis-Tools einen Webservice über SSL mit Basic-Authentication aufgerufen? Ich hab das jetzt mit der Anleitung von IBM versucht:

    https://www.ibm.com/support/pages/ho...n-rest-or-soap

    Egal wie ich es versuche, ich erhalte vom Server immer einen Http 400 Fehler (Bad Request). Aus folgendem Axis-Trace werde ich leider auch nicht schlau.

    Code:
    30/11/2021 17:46:45:929   00000055  transport  > HTTPTransport::openConnection(): 
    30/11/2021 17:46:45:929   00000055  transport  > HTTPTransport::closeConnection(): 
    30/11/2021 17:46:45:929   00000055  transport  > HTTPTransport::resetInputStateMachine(): 
    30/11/2021 17:46:45:930   00000055  transport  < HTTPTransport::resetInputStateMachine(): 
    30/11/2021 17:46:45:930   00000055  transport  > TCPChannel::close(): 
    30/11/2021 17:46:45:930   00000055  transport  < TCPChannel::close(): 
    30/11/2021 17:46:45:930   00000055  transport  < HTTPTransport::closeConnection(): 
    30/11/2021 17:46:45:930   00000055  transport  > TCPChannel::open(): 
    30/11/2021 17:46:45:931   00000055  transport  D TCPChannel::open(): Connecting to: apitest.payengine.de:443
    30/11/2021 17:46:45:941   00000055  transport  < TCPChannel::open(): 
    30/11/2021 17:46:45:941   00000055  transport  > TCPChannel::doSSLHandshake(): 
    30/11/2021 17:46:45:942   00000055  transport  > TCPChannel::createGSKitEnvironment(): 
    30/11/2021 17:46:45:942   00000055  transport  D TCPChannel::createGSKitEnvironment(): Attempting to set keyring file using '*SYSTEM'
    30/11/2021 17:46:45:942   00000055  transport  D TCPChannel::createGSKitEnvironment(): Disabling SSLV2
    30/11/2021 17:46:45:943   00000055  transport  D TCPChannel::createGSKitEnvironment(): Disabling SSLV3
    30/11/2021 17:46:45:943   00000055  transport  D TCPChannel::createGSKitEnvironment(): Disabling TLSV1
    30/11/2021 17:46:45:943   00000055  transport  D TCPChannel::createGSKitEnvironment(): Enabled TLSV11
    30/11/2021 17:46:45:943   00000055  transport  D TCPChannel::createGSKitEnvironment(): Enabled TLSV12
    30/11/2021 17:46:45:943   00000055  transport  < TCPChannel::createGSKitEnvironment(): Exit with return code of AXIS_SUCCESS
    30/11/2021 17:46:45:975   00000055  transport  < TCPChannel::doSSLHandshake(): Exit with boolean true
    30/11/2021 17:46:45:975   00000055  transport  < HTTPTransport::openConnection(): Exit with return code of AXIS_SUCCESS
    30/11/2021 17:46:45:975   00000055  transport  > HTTPTransport::flushOutput(): 
    30/11/2021 17:46:45:976   00000055  transport  > HTTPTransport::generateHTTPHeaders(): 
    30/11/2021 17:46:45:976   00000055  transport  > HTTPTransport::setTransportProperty(): 
    30/11/2021 17:46:45:976   00000055  transport  D HTTPTransport::setTransportProperty(): Transport property to set: Authorization=Basic dasistnureintestbase64code (replace=true)
    30/11/2021 17:46:45:976   00000055  transport  < HTTPTransport::setTransportProperty(): Exit with return code of AXIS_SUCCESS
    30/11/2021 17:46:45:976   00000055  transport  < HTTPTransport::generateHTTPHeaders(): 
    30/11/2021 17:46:45:977   00000055  transport  > TCPChannel::writeBytes(): 
    30/11/2021 17:46:45:977   00000055  transport  D TCPChannel::writeBytes(): Using SSL output stream.
    30/11/2021 17:46:45:977   00000055  transport  D TCPChannel::writeBytes(): 
    GET /v1/orders                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   HTTP/1.1
    Host: apitest.payengine.de
    Accept: application/json
    Authorization: Basic dasistnureintestbase64code
    
    
    30/11/2021 17:46:45:977   00000055  transport  < TCPChannel::writeBytes(): Exit with integer value of 1114
    30/11/2021 17:46:45:978   00000055  transport  > HTTPTransport::resetOutputStateMachine(): 
    30/11/2021 17:46:45:978   00000055  transport  < HTTPTransport::resetOutputStateMachine(): 
    30/11/2021 17:46:45:978   00000055  transport  < HTTPTransport::flushOutput(): 
    30/11/2021 17:46:45:978   00000055  engine     < axiscTransportFlush(): 
    30/11/2021 17:46:45:978   00000055  engine     > axiscTransportReceive(): 
    30/11/2021 17:46:45:978   00000055  engine     D axiscTransportReceive(): user buffer length is 16000000
    30/11/2021 17:46:45:979   00000055  engine     D axiscTransportReceive(): reading transport data
    30/11/2021 17:46:45:979   00000055  transport  > HTTPTransport::getBytes(): 
    30/11/2021 17:46:45:979   00000055  transport  D HTTPTransport::getBytes(): number of bytes to read is 131072
    30/11/2021 17:46:45:979   00000055  transport  D HTTPTransport::getBytes(): GetBytesState: eWaitingForHTTPHeader
    30/11/2021 17:46:45:979   00000055  transport  D HTTPTransport::getBytes(): No data to read, so read HTTP header
    30/11/2021 17:46:45:980   00000055  transport  > HTTPTransport::readHTTPHeader(): 
    30/11/2021 17:46:45:980   00000055  transport  > HTTPTransport::resetInputStateMachine(): 
    30/11/2021 17:46:45:980   00000055  transport  < HTTPTransport::resetInputStateMachine(): 
    30/11/2021 17:46:45:980   00000055  transport  > TCPChannel::readBytes(): 
    30/11/2021 17:46:45:980   00000055  transport  D TCPChannel::readBytes(): Using SSL input stream.
    30/11/2021 17:46:45:986   00000055  transport  D TCPChannel::readBytes(): number of bytes read is 376
    30/11/2021 17:46:45:986   00000055  transport  D TCPChannel::readBytes(): 
    HTTP/1.1 400 Bad Request
    Date: Tue, 30 Nov 2021 16:46:46 GMT
    Content-Length: 226
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    
    30/11/2021 17:46:45:987   00000055  transport  < TCPChannel::readBytes(): Exit with integer value of 376
    30/11/2021 17:46:45:987   00000055  transport  > HTTPTransport::processHTTPHeader(): 
    30/11/2021 17:46:45:987   00000055  transport  < HTTPTransport::processHTTPHeader(): 
    30/11/2021 17:46:45:987   00000055  transport  < HTTPTransport::readHTTPHeader(): 
    30/11/2021 17:46:45:987   00000055  transport  > HTTPTransport::getBytes_MessageHasContentLength(): 
    30/11/2021 17:46:45:988   00000055  transport  D HTTPTransport::getBytes_MessageHasContentLength(): Message has been completely received, input state is waiting for HTTP header
    30/11/2021 17:46:45:988   00000055  transport  D HTTPTransport::getBytes_MessageHasContentLength(): Bytes available to be consumed: 226
    30/11/2021 17:46:45:988   00000055  transport  < HTTPTransport::getBytes_MessageHasContentLength(): Exit with integer value of 226
    30/11/2021 17:46:45:988   00000055  transport  D HTTPTransport::getBytes(): copied 226/226 bytes to passed-in buffer
    30/11/2021 17:46:45:988   00000055  transport  < HTTPTransport::getBytes(): 
    30/11/2021 17:46:45:988   00000055  engine     D axiscTransportReceive(): transport status: TRANSPORT_FINISHED
    30/11/2021 17:46:45:989   00000055  engine     D axiscTransportReceive(): bytes read: 226
    30/11/2021 17:46:45:989   00000055  transport  > HTTPTransport::getTransportProperty(): 
    30/11/2021 17:46:45:989   00000055  transport  < HTTPTransport::getTransportProperty(): Exit with string "true"
    30/11/2021 17:46:45:989   00000055  engine     D axiscTransportReceive(): converting data from UTF8 to job CCSID
    30/11/2021 17:46:45:989   00000055  engine     D axiscTransportReceive(): total number of available bytes to read: 226
    30/11/2021 17:46:45:990   00000055  engine     < axiscTransportReceive(): 
    30/11/2021 17:46:45:990   00000055  engine     > axiscTransportReceive(): 
    30/11/2021 17:46:45:990   00000055  engine     D axiscTransportReceive(): user buffer length is 15999774
    30/11/2021 17:46:45:990   00000055  engine     D axiscTransportReceive(): total number of available bytes to read: 0
    30/11/2021 17:46:45:990   00000055  engine     < axiscTransportReceive():
    Beim Service-Anbieter kommt angeblich gar kein Request an. Ich stehe jetzt irgendwie auf dem Schlauch.

    Habt Ihr eine Idee wo der Fehler liegen könnte?

    Danke,
    KM

  2. #2
    Registriert seit
    Nov 2020
    Beiträge
    164
    Hallo KM,

    Da scheinen ja die Spezialisten beim Service-Anbieter zu sein
    Nach deinem Log zu urteilen, hast die HTTP Verbindung (mit Basic-Auth geklappt) und du hast auch vom Server eine Antwort bekommen: HTTP 400 Bad Request.
    Wenn sie nichts bei sich erkennen können, dann nur deshalb weil deren WebServer in solch einem Fall kein Log produziert, oder sie nicht wissen wo das Log zu finden ist.

    Der Fehler scheint darin zu liegen, dass der Pfad in der URL nicht korrekt ist und dadurch der WebServer nicht weiß wohin er den Request leiten soll.
    Oder deine HTTP Request Methode ist nicht die Erforderliche.
    Ich glaube hier herauslesen zu können, dass du ein JSON schickst mit einem HTTP GET Request auf apitest.payengine.de/v1/orders?
    Dies müsste dann eher ein POST Request sein.

    Ich hoffe das hilft dir etwas weiter.
    lg Andreas

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    164
    ... Natürlich könntest du das ganze auch über SQL machen.
    Nach dem letzten TR ist das auch nicht mehr mit Java im Hintergrund, wodurch die Performance besser geworden ist (zumindest beim ersten Aufruf).

  4. #4
    KM ist offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    994
    Hallo Andreas,

    danke schon mal für Deine Antwort!
    Der GET ist hier schon richtig. Es sollen nämlich alle Orders aufgelistet werden. Das steht auch so in der Webservice-Beschreibung. Ich schicke kein JSON mit. Ich hab nur den Header mit der Basic-Authentication. Mit einem anderen Webservice-Client (z.B. SoapUI) funktioniert der Aufruf ja auch. Es muss also irgendwie mit diesen Axis-Tools zu tun haben. Nur leider finde ich nicht heraus wo das Problem liegt, da ich alles so mache wie es von IBM beschrieben ist.

    Ich sehe das eigentlich auch so, dass die Connection zustande kommt und nur irgendwas an der URI oder ähnliches nicht passt. Vielleicht eine Zeichencodierung oder sowas. Aber ich seh's halt nicht. Normalerweise sollte der Webservice-Anbieter das ja in seinen Logs sehen. Ich hab da auch nochmal hingeschrieben. Mal sehen was sie antworten.

    Wir haben vergangenes Wochenende auch das neue TR installiert. So kann ich auch die neuen SQL-Funktionen (HTTP_GET, etc.) ohne Java im Hintergrund verwenden. Das hatte ich auch schon getestet und funktioniert. Die alten Funktionen (mit Java) waren einfach nicht performant genug. Deshalb hatte ich für uns ja diesen Wrapper über die Axis-Tools programmiert. Wenn ich das nun richtig sehe, scheinen diese neuen Funktionen wohl auch diese Axis-Tools im Hintergrund zu verwenden.
    Das einzige Problem, das ich hiermit habe, ist dass es offenbar keine Funktion für einen Http PATCH gibt. Das benötigen wir aber, da bei den Webservices dieses Anbieters öfters auch PATCH erforderlich ist. Deshalb wollte ich eigentlich alles mit meinem Wrapper-Programm lösen.

    Viele Grüße,
    KM

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    164
    Vielleicht fehlt dir ein Slash (/) am Ende der URL.
    Man könnte auch 2 mal einen TCP Trace auf der IBM i starten.
    Einmal mit einer funktionierenden Lösung (z.B. mit der SQL Funktion).
    Und einmal mit dem Axis.
    Das Ergebnis kann man dann dann miteinander auf Packetebene vergleichen.

    Natürlich, wenn der Service Anbieter seine Logs lesen kann, oder das Debuglevel höher setzt um mehr Infos zu bekommen, ist es einfacher.

Ähnliche Themen

  1. Webservices zur Modularisierung von IBM i Anwendungen
    Von ML-Software im Forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 29-03-21, 12:22
  2. Webservices eigenes Subsystem
    Von Flappes im Forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 23-02-21, 12:07
  3. Wie kann man über SQL ein I5-Programm aufrufen
    Von MR-BN im Forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 02-10-15, 16:40
  4. IBM 4230 und AXIS Printserver 5470e
    Von Bergsoft im Forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 02-04-03, 07:22
  5. Kostenloser id@y Webservices mit .NET am 28.11. in Burghausen
    Von ppedv im Forum Archiv NEWSboard Events
    Antworten: 0
    Letzter Beitrag: 24-10-02, 10:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •