AXIS2 генерирует неправильное сообщение SOAP из-за кодировки. как это исправить?

ВОПРОС: как я могу использовать другую кодировку (кодировку и передачу) с осью?

Вот мой клиент:

public Object[] invoke(String xmlRepresentation)
            throws CustomApplicationException {

            Object[] responseWS = null;
            RPCServiceClient serviceClient = new RPCServiceClient();            
            Options options = serviceClient.getOptions();           
            options.setAction("WBSREFT");
            options.setTo(new EndpointReference("http://localhost:6132"));
            QName qName = new QName(XML_SCHEMA, operation);

            Object[] args = new Object[] { "blablabla" };
            responseWS = serviceClient.invokeBlocking(qName, args, returnTypes);


            String responseAsString = (String) responseWS[0];
            return responseWS;

    }

Вот генерируемый SOAPEnvelope (захваченный с помощью монитора TCP/IP):

<?xml version="1.0" encoding="http://schemas.xmlsoap.org/soap/envelope/"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<WBSREFT xmlns="http://tempuri.org/LICPOCSampleService">
<arg0 xmlns="">blablabla</arg0>
</WBSREFT>
</soapenv:Body>
</soapenv:Envelope>

ПОЧЕМУ Axis2 создал эту дурацкую кодировку (http://schemas.xmlsoap.org/soap/envelope )???

Используя Apache TCPMon, я перехватил этот запрос:

POST / HTTP/1.1
Content-Type: text/xml; charset=UTF-8
SOAPAction: "WBSREFT"
User-Agent: Axis2
Host: 172.17.192.113:6133
Transfer-Encoding: chunked

102
<?xml version='1.0' encoding='UTF-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
         <WBSREFT xmlns="http://tempuri.org/LICPOCSampleService">
            <arg0 xmlns="">to cobol</arg0>
         </WBSREFT>
      </soapenv:Body>
   </soapenv:Envelope>0

Если я отправлю XML-запрос с помощью soapUI, это то, что фиксирует TCPMon:

POST / HTTP/0.9
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
User-Agent: Jakarta Commons-HttpClient/3.1
Host: 172.17.192.113:6133
Content-Length: 265

<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
         <WBSREFT xmlns="http://tempuri.org/LICPOCSampleService">
            <arg0 xmlns="">to cobol</arg0>
         </WBSREFT>
      </soapenv:Body>
   </soapenv:Envelope>

Я заметил этот странный вывод: 102 и 0 в середине XML... что это может быть?


person Lucas Pottersky    schedule 02.03.2009    source источник
comment
Я думаю, вы также должны опубликовать минимальный код, который воспроизводимо создает неработающий запрос SOAP.   -  person Tomalak    schedule 02.03.2009
comment
Вы публикуете 3 фрагмента XML. Только первый имеет атрибут странной/сломанной кодировки. Как вы произвели последние два?   -  person Joachim Sauer    schedule 02.03.2009


Ответы (2)


102 и 0 в середине XML являются артефактами «Transfer-Encoding: chunked», они не являются частью отправляемого вами контента.

person Joachim Sauer    schedule 02.03.2009

В конце концов, подключаемый модуль Eclipse TCP/IP Monitor, по-видимому, не давал мне правильный XML-запрос, ведущий меня в неправильном направлении.

Он показывал encoding="http://schemas.xmlsoap.org/soap/envelope/", в то время как Apache TCPMon давал мне разные (ПРАВИЛЬНЫЕ) результаты.

Как отметил saua, проблема заключалась в кодировке фрагмента, которую вы можете изменить с помощью этого (И РЕШИЛИ МОЮ ПРОБЛЕМУ):

options.setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);

И чтобы ответить на мой вопрос:

options.setProperty(org.apache.axis2.Constants.Configuration.CHARACTER_SET_ENCODING, "UTF-8");
person Lucas Pottersky    schedule 02.03.2009
comment
Кодирование фрагментов не является проблемой, это стандартизированный способ передачи данных. Почему вы хотите изменить его? - person Joachim Sauer; 02.03.2009
comment
ну, почему-то веб-сервис не понимал кодировку. это веб-сервисы COBOL. - person Lucas Pottersky; 03.03.2009