Undefinierte Zeichenketten in SOAP Nachricht

Status
Nicht offen für weitere Antworten.

Conn

Aktives Mitglied
Hallo,

sitze gerade an meiner Bachelor Thesis. Möchte für Forschungszwecke eine komplett eigenständige SOAP WebService Implementierung erstellen(ohne die gängigen Frameworks).

Habe einen SOAP Client geschrieben der zunächst für Testzwecke eine SOAP Request an einen deployten JAX-WS WebService schickt und einen entsprechende SOAP Response erhält. Leider enthält dieser undefinierte Zeichenketten (hier 5d c8 und 0), hier die Antwort mit Header:
Code:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8

5d
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body
c8
><ns2:sendPollResponse xmlns:ns2="http://ba-finkelstein.org/wsdl/EPCglobalEPCISService"><return><queryName>Neu:Das ist wieder ein Test</queryName></return></ns2:sendPollResponse></S:Body></S:Envelope>
0

Kennt jemand ein ähnliches Phänomen. Hatte überlegt, dass das was mit der Zeichenkodierung charset=utf-8 zu tun haben könnte, konnte aber keine Dekodierung finden, die diese Zeichenketten aufgelöst hätte.

Für mögliche Antworten oder Hinweise im Voraus vielen Dank.

Viele Grüße,
Conrad

@admin
SORRY an falscher stelle gepostet ... bitte nach SOA verschieben ... vielen Dank
 
Zuletzt bearbeitet:

musiKk

Top Contributor
Ist mir auch schon aufgefallen. Da ich selbst nicht der Implementer war, wars mir aber bisher egal.

Das scheint mit dem Übertragungsmodus "chunked" zusammenzuhängen. 5d z. B. ist 93 und die Zeile, die danach folgt, ist auch genau 93 Zeichen lang. Ist also keine Sache von SOAP, sondern HTTP. Im entsprechenden RFC dürfte das zu finden sein.
 

Conn

Aktives Mitglied
@musiKk
Vielen Dank für die Antwort.
Das war der entscheidende Hinweis:

The content can be broken up into a number of chunks; each of which is prefixed by its size in bytes. A zero size chunk indicates the end of the response message. If a server is using chunked encoding it must set the Transfer-Encoding header to "chunked".
Quelle: HTTP Chunked Encoding
 

Conn

Aktives Mitglied
Würde gerne ergänzend noch eine Frage loswerden.
Gibt es irgendeine besonders schöne(performante) Variante den "chunked" Inputstream auzulesen??

Hatte eigentlich vor den InputStream direkt an die XMLStreamReader Klasse weiterzuleiten. Dadurch das ich ja nun im Vorfeld nicht weiß, welche Teile notwendig sind, muss ich einzelne String-Teile in StringBuilder Objekten zwischenspeichern(in meiner Lösung):

Code:
       StringBuilder tmpBuilder = new StringBuilder();
       boolean hit = false;
       int chunckedInt;

       int c;
       while((c=inputStream.read())!=-1) {         
            if((char)c != '\r' && (char)c != '\n') {
                if(hit) hit = false;
                tmpBuilder.append((char)c);
            }
            else if(!hit) {

                if(tmpBuilder.toString().matches(("\\p{XDigit}+"))) {

                    hit = true;
                    chunckedInt = Integer.parseInt(tmpBuilder.toString(), 16);

                    if(chunckedInt == 0) {
                        tmpBuilder = new StringBuilder();
                        break;
                    }

                }
                else {
                    this.inputPipe.getOutputStream().write(tmpBuilder.toString().getBytes());
                }
                tmpBuilder = new StringBuilder();
            }
        }

        this.inputPipe.getOutputStream().write(tmpBuilder.toString().getBytes());
        this.inputPipe.getOutputStream().close();


Bewege mich in Regionen jenseits der 100.000 Objekte, deshalb hatte ich eine unmittelbare Streamverarbeitung angedacht. Leider macht mir hier das "Chunked Encoding" einen Strich durch die Rechnung.

Falls Ihr nochmal eine Idee habt, erneut im Voraus vielen Dank.

Viele Grüße,
Conrad
 

Conn

Aktives Mitglied
Hier der letzte Beitrag zum Thema. Meine Lösung mit der ich vorerst weiterarbeiten will. Hierbei werden die Zeichen die zur SOAP Message gehören rausgefiltert und direkt an den verarbeitenden Stream weitergegeben.

Code:
 public void readInputStream(InputStream inputStream) throws IOException {

        boolean chunked = true;
        StringBuilder chunkedBuilder = new StringBuilder();

        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream,"UTF-8");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(this.inputPipe.getOutputStream(),"UTF-8");

        int bytes = 0;
        int c;
        while ((c = bufferedReader.read()) != -1) {


           

            if ((char) c != '\r' && (char) c != '\n') {
                if (chunked) {
                    chunkedBuilder.append((char) c);

                } else {

                    if (bytes == 0) {
                        bytes = Integer.parseInt(chunkedBuilder.toString(), 16);
                        chunkedBuilder.delete(0, chunkedBuilder.length());

                    }

                    if (bytes > 0) {

                       

                        bytes -= this.countBytesForChar((char)c);
                        outputStreamWriter.write(c);
                    }

                }
            } else {
                if (chunkedBuilder.length() > 0) {
                    chunked = false;
                } else {
                    chunked = true;
                }

                if (chunkedBuilder.length() == 1 && chunkedBuilder.charAt(0) == '0') {
                    break;
                }

            }

        }


        outputStreamWriter.close();



   

    }

    private int countBytesForChar(char c) {
        byte[] byteArray = {(byte) (c & 0xff), (byte) (c >> 8 & 0xff)};
        if (byteArray[1] == 0) {
            return 1;
        } else {
            return 2;
        }

    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Behörden Soap service konsumieren SOA 4
M problem mit großem SOAP Response SOA 3
pkm Struktur einer SOAP-Anwendung SOA 28
N SOAP-Nachrichten verschlüsseln | jax-ws SOA 0
S Soap Request absenden - Anfängerfrage SOA 0
I SOAP Webservice Methoden und Parameter auslesen SOA 3
D [SOAP] wsdl & maven & java 1.8 SOA 6
P SOAP Webservice mit HTTP Basic Authentifizierung SOA 1
E SOAP-Endpunkt per Eclipse-Wizard erstellt, wie nun mit Auth schützen? SOA 2
M Kann man das Protokoll eines REST (Jersey) bzw. SOAP Web Services manipulieren? SOA 5
G SOAP Response "faken" SOA 8
D SOAP Webservice (SAP) SOA 3
K Flex-Ablöse - Was mit den SOAP-Services tun? SOA 5
G Soap, http SOA 3
A Soap with Attachments - Unmarshalling Error SOA 4
K Axis2 SOAP Logging via Client SOA 2
E mit Apache SOAP verschachtelte XML-Tags generieren SOA 2
F XML per SOAP übermitteln SOA 2
H SOAP und Synonym-Wortschatz Leipzig SOA 4
V SOAP over JMS - wie funktionierts? SOA 3
E Lesen der kompletten SOAP als WebService Provider/Server SOA 4
R SOAP Nachrichtenaustausch zwischen Axis2-WSs SOA 5
R Webservice aufrufen mit SOAP Style.DOCUMENT ? SOA 5
I SOAP WSDL und UDDI SOA 12
G --> SOAP zwischen Intranet und Internet SOA 3
K Mappen von Objektmethoden bei SOAP SOA 7

Ähnliche Java Themen

Neue Themen


Oben