Как вы можете удалить объявления пространства имен в ksoap? - PullRequest
1 голос
/ 21 января 2012

Сразу же, вот моя реализация вызова Soap, за исключением ненужных битов.

public class MySoapClient implements AbstractSoapClient
{

    private String NAMESPACE = "http://www.examples.com/wsdl/MyService/";
    private String METHOD_NAME = "getPersonDetails";
    private String SOAP_ACTION = "http://www.examples.com/getPersonDetails/";
    String URL = "http://192.168.0.10:8088/mockMyServiceBinding?WSDL";


    public Object process() throws Exception
    {
        SoapSerializationEnvelope envelope = generateEnvelope();
        return responseObject = makeCall(envelope);
    }

    private SoapSerializationEnvelope generateEnvelope()
    {
        // dont set a namespace for the requestobject, otherwise ksoap adds implicit namespaces onto request elements
        SoapObject requestObject = new SoapObject("", METHOD_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.implicitTypes = true;

        requestObject.addProperty("name", "Dave");
        envelope.setOutputSoapObject(requestObject);

        return envelope;
    }

    private Object makeCall(SoapSerializationEnvelope envelope)
    {
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try
        {
            androidHttpTransport.debug = true;
            androidHttpTransport.call(SOAP_ACTION, envelope);
            return envelope.bodyIn;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return e;
        }
    }


}

Я думаю, что проблема в SoapObject requestObject = new SoapObject("", METHOD_NAME); части.

Если я использую SoapObject requestObject = new SoapObject("", METHOD_NAME);, тогда я получаю это в теле:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema"
            xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header/>
    <v:Body>
        <getPersonDetails xmlns="" id="o0" c:root="1">
            <name>Dave</name>
        </getPersonDetails>
    </v:Body>
</v:Envelope>

Если я использую SoapObject requestObject = new SoapObject(NAMESPACE, METHOD_NAME);, тогда я получаю это в теле:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema"
            xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header/>
    <v:Body>
        <n0:getPersonDetails id="o0" c:root="1" xmlns:n0="http://www.examples.com/wsdl/MyService/">
            <name i:type="d:string">Dave</name>
        </n0:getPersonDetails>
    </v:Body>
</v:Envelope>

НО..SoapUI принимает в качестве допустимого XML-запроса только следующее:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema"
            xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header/>
    <v:Body>
        <getPersonDetails>
            <name>Dave</name>
        </getPersonDetails>
    </v:Body>
</v:Envelope>

По какой-то причине ему не нравится часть xmlns="http://www.examples.com/getPersonDetails/" id="o0" c:root="1", но я не могу найти способ удалить ее, пожалуйста, помогите!

Так как мне полностью удалить объявление xmlns? Он чувствует себя "грязным", создавая SoapObject и устанавливая пространство имен в ""

Ответы [ 2 ]

9 голосов
/ 21 января 2012

Играйте с

envelope.implicitTypes = true;

, а также с

envelope.setAddAdornments(false);

и посмотрите, сможете ли вы сделать то, что вы хотите.Также имейте в виду, что в конце концов запрос полностью действителен, и он будет зависеть от вашего сервера, если с ним все в порядке, а НЕ с SoapUI.

0 голосов
/ 16 января 2017

Если вы все еще не можете удалить или вам нужно создать XML-элемент Nested Request, используйте этот.

public static SoapSerializationEnvelope getSoapEnvelopeForRegister(String methodName, String nameSpace, Hashtable hashProperty, Hashtable securityQueAns) {
        SoapObject soapObject = new SoapObject(nameSpace, methodName);

        for (Object sKey : hashProperty.keySet()) {
            Object sValue = hashProperty.get(sKey);
            soapObject.addProperty(sKey.toString(), sValue);
        }

        SoapObject item = new SoapObject("", "securityQuestions");
        for (Object sKey : securityQueAns.keySet()) {
            Object sValue = securityQueAns.get(sKey);
            item.addProperty(sKey.toString(), sValue);
        }
        soapObject.addSoapObject(item);

        //Log.d("REQ: Obj: ", soapObject.toString());
        return createSoapEnvelope(soapObject);
    }

Выходной запрос.это так:

<UNAME>nk</UNAME>
         <MOBILENUMBER>0561063097</MOBILENUMBER>
         <UPWD>p</UPWD>
         <CARDNUMBER>5173950000000105</CARDNUMBER>
         <EMAILID>CARDOPS@MAWARID.AE</EMAILID>
         <CARDHOLDER>AHDAB INTERNATIONAL LUXURY TRANSPORT LLC</CARDHOLDER>
         <DEVICEID>e7fdd833268c96c7</DEVICEID>
         <DOB>1975-01-01</DOB>
         <securityQuestions>
            <SA1>a1</SA1>
            <SA2>a2</SA2>
            <SQ2>What is your first school name?</SQ2>
            <SQ1>Where was your first job?</SQ1>
            <SA3>a3</SA3>
            <SQ3>What is your first school name?</SQ3>
         </securityQuestions>
...