2010-04-07 5 views
18

यहाँ मेरी कोडएंड्रॉइड पर ksoap2 का उपयोग कर डब्ल्यूसीएफ सेवा को कैसे कॉल करें?

import org.ksoap2.*; 
import org.ksoap2.serialization.*; 
import org.ksoap2.transport.*; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class ksop2test extends Activity { 
/** Called when the activity is first created. */ 


private static final String METHOD_NAME = "SayHello"; 
// private static final String METHOD_NAME = "HelloWorld"; 

private static final String NAMESPACE = "http://tempuri.org"; 
// private static final String NAMESPACE = "http://tempuri.org"; 

private static final String URL = "http://192.168.0.2:8080/HelloWCF/Service1.svc"; 
// private static final String URL = "http://192.168.0.2:8080/webservice1/Service1.asmx"; 

final String SOAP_ACTION = "http://tempuri.org/IService1/SayHello"; 
// final String SOAP_ACTION = "http://tempuri.org/HelloWorld"; 
TextView tv; 
StringBuilder sb; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    tv = new TextView(this); 
    sb = new StringBuilder(); 
    call(); 
    tv.setText(sb.toString()); 
    setContentView(tv); 
} 

public void call() { 
    try { 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    request.addProperty("name", "Qing"); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 


    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    androidHttpTransport.call(SOAP_ACTION, envelope); 
    sb.append(envelope.toString() + "\n");//cannot get the xml request send 
    SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

    //to get the data 
    String resultData = result.toString(); 
    // 0 is the first object of data 


    sb.append(resultData + "\n"); 
    } catch (Exception e) { 
    sb.append("Error:\n" + e.getMessage() + "\n"); 
    } 

} 

} 

मैं सफलतापूर्वक .asmx सेवा का उपयोग कर सकते है, लेकिन जब मैं एक WCF सेवा को कॉल करने की कोशिश आभासी मशीन ने कहा: त्रुटि: की उम्मीद: END_TAG {http://schemas.xmlsoap.org/soap/envelope/} बॉडी (स्थिति: END_TAGhttp: //schemas.xmlsoap.org/soap/envelope/} रों: दोष> @ 1: 712 [email protected]

में मुद्रित करने के लिए कैसे क्या अनुरोध भेजने

यहाँ है wcf wsdl:

<wsdl:definitions name="Service1" targetNamespace="http://tempuri.org/"> 

<wsdl:types> 
    <xsd:schema targetNamespace="http://tempuri.org/Imports"> 
    <xsd:import schemaLocation="http://para-bj.para.local:8080/HelloWCF/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/> 
    <xsd:import schemaLocation="http://para-bj.para.local:8080/HelloWCF/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> 
    </xsd:schema> 
</wsdl:types> 

<wsdl:message name="IService1_SayHello_InputMessage"> 
    <wsdl:part name="parameters" element="tns:SayHello"/> 
</wsdl:message> 

<wsdl:message name="IService1_SayHello_OutputMessage"> 
    <wsdl:part name="parameters" element="tns:SayHelloResponse"/> 
</wsdl:message> 

<wsdl:portType name="IService1"> 
    <wsdl:operation name="SayHello"> 
    <wsdl:input wsaw:Action="http://tempuri.org/IService1/SayHello" message="tns:IService1_SayHello_InputMessage"/> 
    <wsdl:output wsaw:Action="http://tempuri.org/IService1/SayHelloResponse" message="tns:IService1_SayHello_OutputMessage"/> 
    </wsdl:operation> 
</wsdl:portType> 

<wsdl:binding name="BasicHttpBinding_IService1" type="tns:IService1"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 

    <wsdl:operation name="SayHello"> 
    <soap:operation soapAction="http://tempuri.org/IService1/SayHello" style="document"/> 

    <wsdl:input> 
     <soap:body use="literal"/> 
    </wsdl:input> 
    <wsdl:output> 
     <soap:body use="literal"/> 
    </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 

<wsdl:service name="Service1"> 

    <wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1"> 
    <soap:address location="http://para-bj.para.local:8080/HelloWCF/Service1.svc"/> 
    </wsdl:port> 
</wsdl:service> 

</wsdl:definitions> 

यह टैग <wsdl:types> में उपयोग करता <xsd:schema> और ASMX टैग <wsdl:types> क्या अंतर है में <s:schema> का उपयोग करता है?

+0

शायद आप ksoap का उपयोग नहीं कर सकते हैं, क्योंकि दवलिक जेवीएम सूर्य जेवीएम जैसा नहीं है। आपको अपना स्वयं का एसओएपी पार्सर लिखना पड़ सकता है। मोबाइल डिवाइस, आईएमओ के लिए एसओएपी वास्तव में बहुत भारी है। –

+0

लेकिन मैं सफलतापूर्वक .asmx सेवा से डेटा प्राप्त कर सकता हूं – Qing

उत्तर

20

अंत में मैं काम करने के लिए मिल गया है क्योंकि नाम स्थान से चूक गए एक "/" अंत में,

निम्नलिखित मेरी कोड

package cn.qing.ksop2test; 


import java.io.Writer; 

import org.ksoap2.*; 
import org.ksoap2.serialization.*; 
import org.ksoap2.transport.*; 
import org.xmlpull.v1.XmlSerializer; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Xml; 
import android.widget.TextView; 

public class ksop2test extends Activity { 
/** Called when the activity is first created. */ 


private static final String METHOD_NAME = "HelloWorldRequest"; 
// private static final String METHOD_NAME = "HelloWorld"; 

private static final String NAMESPACE = "http://tempuri.org/"; 
// private static final String NAMESPACE = "http://tempuri.org"; 

private static final String URL = "http://192.168.0.2:8080/HelloWCF/Service1.svc"; 
// private static final String URL = "http://192.168.0.2:8080/webservice1 /Service1.asmx"; 

final String SOAP_ACTION = "http://tempuri.org/IService1/HelloWorld"; 
// final String SOAP_ACTION = "http://tempuri.org/HelloWorld"; 
TextView tv; 
StringBuilder sb; 
private XmlSerializer writer; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    tv = new TextView(this); 
    sb = new StringBuilder(); 
    call(); 
    tv.setText(sb.toString()); 
    setContentView(tv); 
} 

public void call() { 
    try { 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     request.addProperty("Name", "Qing"); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 


     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

     //to get the data 
     String resultData = result.toString(); 
     // 0 is the first object of data 


     sb.append(resultData + "\n"); 
     } catch (Exception e) { 
     sb.append("Error:\n" + e.getMessage() + "\n"); 
     } 

    } 

} 
+4

एंड्रॉइड ऐप में डब्ल्यूसीएफ webservice तक पहुंचने के लिए यह बहुत अच्छा डेमो कोड है ..........., मैंने इस स्रोत कोड को लागू किया है और मेरे मुद्दों को हल किया है। .... –

+0

मेरे लिए यह बात है कि विधि क्या देता है इसके आधार पर एक अलग प्रतिक्रिया प्रकार है। यदि एक रिटर्न वैल्यू है तो आप एक साबुनप्रिमेट प्रकार का उपयोग करते हैं, यदि कोई जटिल प्रकार है तो आप सोप ऑब्जेक्ट का उपयोग करते हैं। –

+1

आपको पता नहीं है कि इससे मुझे कितनी मदद मिली है। बहुत बहुत धन्यवाद। मैं उस चरित्र को भी याद करता हूं। : डी –

0

मूल सिद्धांत बाध्यकारी और एएसएमएक्स के साथ "सिद्धांत" wcf में वही कार्य करना चाहिए।

यह आपकी डब्ल्यूसीएफ सेवा को कॉन्फ़िगर करने के तरीके के साथ कुछ करने के लिए हो सकता है।

अगर हम क्लाइंट पर ट्रांसफर मोड स्ट्रीम और सर्वर पर Buffered कॉन्फ़िगर करते हैं तो हमें एक ही समस्या मिलती है। हालांकि यह सुनिश्चित नहीं है कि यह आपके मामले में प्रासंगिक है या नहीं।

1

मैं

private static final String SOAP_ACTION = "http://tempuri.org/IContact/GetContactCount"; 
private static final String METHOD_NAME = "GetContactCount"; 
private static final String NAMESPACE = "http://tempuri.org/"; 
private static final String URL = "http://xxx.xxx.com/Contacts/ContactsService.Contacts.svc"; 

तो उपयोग कर रहा हूँ है शायद समस्या आपकी एसओएपी कार्रवाई में है।

आपके विधि नाम पर वर्तनी भी सही है यानी AuthenticatdUser?

0

धन्यवाद किंग आपके उत्तर के लिए यह वास्तव में WCF सेवा फोन करने के लिए पूर्ण मदद है

मैं लिफाफे में outputSoapObject सेट करने के बाद वेब सेवा से सरल और जटिल उत्पादन प्राप्त करने के लिए इस परिहार जोड़ना चाहते हैं, कृपया मुझे सही अगर मैं कर रहा हूँ गलत

envelope.setOutputSoapObject(requestSoapObject); 

     // if its dotnet web service then make it true 
     if (isDotNetWebService) 
      envelope.dotNet = true; 

     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     androidHttpTransport.call(NAMESPACE + methodName, envelope); 

     if (useBodyIn) // use bodyIn if service method returns string/int 
         // etc 
     { 
      /* Gives output from webservice */ 
      responseSoapObject = (SoapObject) envelope.bodyIn; 
     } else // use getResponse() if service method returns objects or 
       // array 
     { 
      /* Gives output from webservice */ 
      responseSoapObject = (SoapObject) envelope.getResponse(); 
     } 
संबंधित मुद्दे