2016-06-01 9 views
1

私はspyneを使用してPythonで書かれた石鹸サーバーを持っています。私はまた、泡を使ってPythonで石鹸クライアントを作成しました。完璧に動作します。ここにサーバーのコードですkSoapをSpyneに接続する際のエラー '{http://schemas.xmlsoap.org/soap/encoding/}root'属性が許可されていません

class Personnel(ServiceBase): 

@rpc(_returns=String) 
def personnel(self): 
    """Docstrings for service methods appear as documentation in the wsdl. 
    <b>What fun!</b> 

    @param name the name to say hello to 
    @param times the number of times to say hello 
    @return the completed array 
    """ 
    employees_list = employees() 
    employees_list.populate_from_db("elleo", "odoo", "0801", "127.0.0.1") 

    tstString = "Dirk" 

    return tstString 

application = Application([Personnel], 'elleo.personnel', 
        in_protocol=Soap11(validator='lxml'), 
        out_protocol=Soap11()) 

wsgi_application = WsgiApplication(application) 

kSOAPを使用して自分のAndroidプログラムと接続すると、エラーが発生します。ここでは、コードです:

String SOAP_ACTION = "http://192.168.1.100:8000/personnel"; 
    String METHOD_NAME = "personnel"; 
    String NAMESPACE = "elleo.personnel"; 
    String URL = "http://192.168.1.100:8000/?wsdl"; 


    try { 
     SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 

     SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     soapEnvelope.dotNet = true; 
     soapEnvelope.setOutputSoapObject(Request); 
     HttpTransportSE transport = new HttpTransportSE(URL); 

     transport.call(SOAP_ACTION, soapEnvelope); 
     resultString = (SoapPrimitive) soapEnvelope.getResponse(); 

     Log.i(TAG, "Result Celsius: " + resultString); 
    } catch (Exception ex) { 
     Log.e(TAG, "Error: " + ex.getMessage()); 
    } 

I次のエラーメッセージが出ます:これを解決する方法を

<faultstring>:1:0:ERROR:SCHEMASV:SCHEMAV_CVC_COMPLEX_TYPE_3_2_1: Element '{elleo.personnel}personnel', attribute '{http://schemas.xmlsoap.org/soap/encoding/}root': The attribute '{http://schemas.xmlsoap.org/soap/encoding/}root' is not allowed.</faultstring> 

任意のアイデアを。これは通信を確立するために使用しようとする小さなプログラムです。この部分がうまくいくなら、私はプログラムを拡張します。

答えて

1

回答が見つかりました。私はそれがなぜ機能するのか理解していると主張していませんが、そうしました。詳細については、How can you remove namespace declarations in ksoap?を参照してください。ここで

は、私は私のJavaプログラムに追加されたコードです:

try { 
    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 

    SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    soapEnvelope.dotNet = true; 
    soapEnvelope.setOutputSoapObject(Request); 
    soapEnvelope.setAddAdornments(false); 
    HttpTransportSE transport = new HttpTransportSE(URL); 

    transport.call(SOAP_ACTION, soapEnvelope); 
    resultString = (SoapPrimitive) soapEnvelope.getResponse(); 

    Log.i(TAG, "Result Celsius: " + resultString); 
} catch (Exception ex) { 
    Log.e(TAG, "Error: " + ex.getMessage()); 
} 
関連する問題