Android पर SOAP वेब सेवा कैसे कॉल करें [बंद]


553

मुझे Android के साथ एक मानक SOAP / WSDL वेब सेवा को कॉल करने के तरीके के बारे में अच्छी जानकारी प्राप्त करने में बहुत परेशानी हो रही है। सभी मुझे मिल गए हैं या तो बहुत जटिल दस्तावेज और "kSoap2" के संदर्भ हैं और फिर कुछ इसे SAX के साथ मैन्युअल रूप से पार्स करने के बारे में कुछ है । ठीक है, यह ठीक है, लेकिन यह 2008 है, इसलिए मुझे लगा कि मानक वेब सेवाओं को कॉल करने के लिए कुछ अच्छी लाइब्रेरी होनी चाहिए।

वेब सेवा केवल मूल रूप से नेटबीन्स में बनाई गई है । मैं नलसाजी वर्गों के निर्माण के लिए आईडीई का समर्थन करना चाहता हूं। मुझे बस एक Android- आधारित फोन से WSDL आधारित वेब सेवा से संपर्क करने के लिए सबसे आसान / सबसे सुरुचिपूर्ण तरीके की आवश्यकता है।


यहाँ Android में SOAP का उपयोग करने पर बहुत अच्छी लिंक है: How to Call Web Service in Android का उपयोग करके SOAP
जैनेन्द्र

यदि कोई पहले एमएस वीएस से परिचित है, तो एंड्रॉइड के लिए मोनो का उपयोग करना डेटा सेवाओं और वेब सेवाओं के साथ कई समस्याओं को हल करेगा, सब कुछ सरल और तेज़ विकास है। इसके अलावा, जो C # (जावा के समान कोड) से परिचित नहीं है, सभी लाइब्रेरी में एक ही तरीके हैं, कुछ कार्यों को गुणों पर प्रतिस्थापित किया गया है, इसलिए लगभग समान नाम वाले और जिन्होंने एंड्रॉइड के लिए जावा पर पहले लिखा था, c # लिखने के लिए अपने अनुभव का उपयोग करके बहुत आसान है कोड।
यूजीन बोसिकोव

नीचे दिए गए लिंक पर एक नज़र डालें, इसमें एंड्रॉइड में एक webservice एक्सेस करने पर एक विस्तृत Eaxample है Ksoap2 का उपयोग करके एंड्रॉइड से एक
फ्रेड ओंडीकी

मेरा मानना ​​है कि यह Xamarin / C # .Net Core का उपयोग करके संभव है। ब्लॉगसेम्सडेन.मेडिसिन.कॉम
वाहिद अमीरी

स्प्रिंग द्वारा यह उपकरण आशाजनक लगता है।
लुई

जवाबों:


245

Android किसी भी प्रकार का SOAP लाइब्रेरी प्रदान नहीं करता है। आप या तो अपना स्वयं का लिख ​​सकते हैं, या कुछ और जैसे kSOAP 2 का उपयोग कर सकते हैं । जैसा कि आप ध्यान दें, अन्य लोग अपने स्वयं के प्रोजेक्ट में kSOAP2 को संकलित करने और उपयोग करने में सक्षम हैं, लेकिन मुझे ऐसा नहीं करना पड़ा।

Google ने, आज तक, SOAP लाइब्रेरी को Android में जोड़ने के लिए बहुत कम रुचि दिखाई है। इसके लिए मेरा संदेह यह है कि वे REST- आधारित सेवाओं की ओर वेब सेवाओं में वर्तमान रुझानों का समर्थन करते हैं, और JSON का उपयोग डेटा एनकैप्सुलेशन प्रारूप के रूप में करते हैं। या, मैसेजिंग के लिए XMPP का उपयोग कर रहे हैं। लेकिन यह सिर्फ अनुमान है।

XML- आधारित वेब सेवाएँ इस समय Android पर थोड़ा गैर-तुच्छ कार्य हैं। नेटबीन्स को नहीं जानते हुए, मैं वहां उपलब्ध उपकरणों से बात नहीं कर सकता, लेकिन मैं मानता हूं कि एक बेहतर पुस्तकालय उपलब्ध होना चाहिए। यह संभव है कि XmlPullParser आपको SAX का उपयोग करने से बचाएगा, लेकिन मुझे इसके बारे में ज्यादा जानकारी नहीं है।


7
हाँ, मुझे लगता है कि मुझे REST प्रॉक्सी का निर्माण करना होगा। यह बहुत अजीब लगता है कि Google को SOAP सहायता प्रदान करने में कोई दिलचस्पी नहीं है। मैंने kSoap विधि की कोशिश की, यह वास्तव में एक गंभीर विकल्प भी नहीं है। यह, सबसे अच्छा है, एक बदसूरत था कि समाचार समूहों के बहुत दस्त की आवश्यकता है।
बॉबीशाफ्टो

19
कारण शायद यह है कि सोप बहुत ही क्रियात्मक है और मोबाइल कंप्यूटिंग की बाधाओं को अच्छी तरह से पूरा नहीं करता है।
नील

92
यह जवाब बेहतर होगा यदि कोई व्यक्ति Android ऐप के साथ वेब सेवाओं को कॉल करने का सबसे अच्छा विकल्प सुझा सकता है । एक बार जब लोग इस सवाल को ढूंढ लेते हैं और इसे पढ़ लेते हैं, तो उनमें से ज्यादातर को यही देखना होगा।
MGOwen

4
JSON जैसे अधिक संक्षिप्त प्रारूप की तुलना में SOAP प्रसंस्करण भी मेमोरी और प्रोसेसर गहन है।
जेरेमी एडवर्ड्स

3
@MGOwen सबसे अच्छा विकल्प जो मैं देख सकता हूं वह एक प्रॉक्सी है। WSDL2Java के माध्यम से SOAP लिफाफे को सम्‍मिलित करने वाला REST-ful इंटरफ़ेस लागू करें।

99

org.apache.http.impl.client.DefaultHttpClientडिफ़ॉल्ट रूप से एंड्रॉइड एसडीके में आता है। यह आपको WSDL से जुड़ा मिलेगा।

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);

5
हाँ, यह वह मार्ग होगा जहाँ मुझे मैन्युअल रूप से सब कुछ पार्स करना होगा, मुझे ऑब्जेक्ट ओरिएंटेड दृष्टिकोण नहीं मिलेगा।
बॉबीशैफ्टो

93
आपका मतलब है कि आपको मुफ्त में दोपहर का भोजन नहीं मिलेगा। मैनुअल पार्सिंग का OO से कोई लेना-देना नहीं है। मैं अपने सबसे उन्नत टूल में HB1 पेंसिल होने के साथ कागज पर सब कुछ पार्स कर सकता था और यह अभी भी OO होगा।
नील

8
मेरा मानना ​​है कि OO द्वारा लेखक का मतलब जावा-एक्सएमएल बाइंडिंग है। प्रतिक्रिया को पार्स करने के लिए इस दृष्टिकोण में आपका अगला कदम क्या होगा? और अगर इसमें सैकड़ों तत्व हैं, तो एक पेड़ की संरचना में आयोजित किया जाता है?
रस्टेक्स

12
BTW, मुझे उम्मीद है कि कम से कम HTTP POST एक GET नहीं होगा, अगर आप SOAP के साथ कोई भाग्य रखना चाहते हैं। इसके अलावा, स्वीकार और SOAPAction हेडर कहाँ है? यदि आप वास्तव में कमांडो जाना चाहते हैं तो SOAP सेवा का उपभोग करने के लिए इन 4 लाइनों की तुलना में बहुत अधिक लगेगा।
रस्टेक्स

6
@ नील: क्या होगा यदि आप एसओएपी का उपयोग करने के लिए परिस्थितियों से मजबूर थे, उदाहरण के लिए वेबसर्वर सोप का उपयोग करता है और आपने इस पर नियंत्रण नहीं किया है?
Bjarke Freund-हैनसेन

59

यह सच है कि इसके कारण मोबाइल उपकरणों के साथ डेटा विनिमय के लिए SOAP सबसे अच्छा विकल्प नहीं है। हालाँकि, आप स्वयं को उस स्थिति में पा सकते हैं जिसमें आप सर्वर आउटपुट के प्रारूप को नियंत्रित नहीं करते हैं।

इसलिए, यदि आपको SOAP के साथ रहना है, तो यहां Android के लिए एक kSOAP2 लाइब्रेरी पैच है:
http://code.google.com/p/ksoap2-android/


31

मोबाइल डिवाइस (विशेष रूप से एंड्रॉइड फोन पर) से एक वेब सेवा को कॉल करने के लिए, मैंने इसे करने के लिए बहुत ही सरल तरीके का उपयोग किया है। मैंने वेब सेवा को कॉल करने के प्रयास में किसी भी वेब सेवा क्लाइंट API का उपयोग नहीं किया है। मेरा दृष्टिकोण कॉल करने के लिए निम्नानुसार है।

  1. जावा मानक एपीआई का उपयोग करके एक सरल HTTP कनेक्शन बनाएं HttpURLConnection
  2. SOAP अनुरोध प्रपत्र। (SOAP अनुरोध करने के लिए आप SOAPUI की मदद ले सकते हैं।)
  3. DoOutPut ध्वज को सत्य के रूप में सेट करें।
  4. HTTP हेडर मानों को सामग्री-लंबाई, सामग्री प्रकार और उपयोगकर्ता-एजेंट के रूप में सेट करें। सामग्री-लंबाई मान सेट करना न भूलें क्योंकि यह एक अनिवार्य है।
  5. आउटपुट स्ट्रीम में संपूर्ण SOAP अनुरोध लिखें।
  6. एक कनेक्शन बनाने के लिए विधि को कॉल करें और प्रतिक्रिया प्राप्त करें (मेरे मामले में मैंने इस्तेमाल किया getResonseCode)।
  7. यदि आपके प्राप्त प्रतिक्रिया कोड के रूप में
    1. इसका मतलब है कि आप वेब सेवा को कॉल करने में सफल रहे हैं।
  8. अब उसी HTTP कनेक्शन पर एक इनपुट स्ट्रीम लें और स्ट्रिंग ऑब्जेक्ट प्राप्त करें। यह स्ट्रिंग ऑब्जेक्ट SOAP प्रतिक्रिया है।
  9. यदि प्रतिक्रिया कोड 200 से अधिक है, तो ErrorInputउसी HTTPobject पर एक स्ट्रीम लें और यदि कोई हो तो त्रुटि प्राप्त करें।
  10. SAXParser (मेरे मामले में) या DOMParaser या किसी अन्य पार्सिंग तंत्र का उपयोग करके प्राप्त प्रतिक्रिया को पार्स करें।

मैंने एंड्रॉइड फोन के लिए इस प्रक्रिया को लागू किया है, और यह सफलतापूर्वक चल रहा है। मैं 700 केबी से अधिक होने पर भी प्रतिक्रिया को पार्स करने में सक्षम हूं।


30

SOAP एंड्रॉइड (या सामान्य रूप से मोबाइल उपकरणों) पर उपयोग के लिए एक बीमार-अनुकूल तकनीक है, जो आवश्यक है कि प्रसंस्करण / पार्सिंग ओवरहेड के कारण। REST सेवाएँ एक हल्के वजन का समाधान है और यही मैं सुझाव देता हूँ। एंड्रॉइड SAX पार्सर के साथ आता है, और यह उपयोग करने के लिए काफी तुच्छ है। यदि आपको मोबाइल डिवाइस पर SOAP को संभालने / पार्स करने की पूरी आवश्यकता है तो मुझे आपके लिए खेद है, मैं जो सबसे अच्छी सलाह दे सकता हूं वह है SOAP का उपयोग न करना।


2
उन लोगों के लिए नरक में एक विशेष स्थान है जो डेवलपर्स को REST API के बजाय SOAP सेवाओं का उपयोग करने के लिए मजबूर करते हैं।
हितेश साहू

24

लगभग एक साल पहले मैं इस थ्रेड को पढ़ रहा था कि कैसे Android पर SOAP कॉल करने की कोशिश की जा रही है - HttpClient का उपयोग करके अपने स्वयं के निर्माण के सुझावों से मुझे एंड्रॉइड के लिए अपनी SOAP लाइब्रेरी बनाने में मदद मिली:

IceSoap

मूल रूप से यह आपको एक सरल जावा एपीआई के माध्यम से भेजने के लिए लिफाफे बनाने की अनुमति देता है, फिर स्वचालित रूप से उन्हें उन वस्तुओं में पार्स करता है जिन्हें आप XPath के माध्यम से परिभाषित करते हैं ... उदाहरण के लिए:

<Dictionary>
    <Id></Id>
    <Name></Name>
</Dictionary>

हो जाता है:

@XMLObject("//Dictionary")
public class Dictionary {
    @XMLField("Id")
    private String id;

    @XMLField("Name")
    private String name;
}

मैं इसे अपने प्रोजेक्ट के लिए उपयोग कर रहा था, लेकिन मुझे लगा कि यह कुछ अन्य लोगों की मदद कर सकता है इसलिए मैंने इसे अलग करने और इसे प्रलेखित करने में कुछ समय बिताया है। मैं वास्तव में इसे पसंद करूंगा अगर आपके कुछ गरीब आत्माएं जो "SOAP एंड्रॉइड" को गुगली करते समय इस धागे पर ठोकर खाते हैं, तो यह एक जाने दे सकता है और कुछ लाभ प्राप्त कर सकता है।


क्या आपने IceSoap पर सत्र प्रमाणीकरण के साथ काम किया?
अदनान चौबी 16

24

अपने प्रोजेक्ट में ADD ksoap2.jar को न भूलें और AndroidManif फ़ाइल में इंटरनेट की अनुमति भी जोड़ें

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}

HttpTransportSE मुझे यह क्लास कहाँ से मिल सकती है ??
नोमान

नमस्कार, मैं आपके कोड का उपयोग कर रहा हूं, लेकिन मुझे निम्नलिखित त्रुटि मिल रही है, प्रतिक्रिया :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = त्रुटि; संदेशों = anytype {MessagesTypeMessage = anytype {कोड = E00014; पाठ = व्यापारी प्रमाणीकरण आवश्यक है ।; }; }; }; } क्या आप मेरी मदद कर सकते हैं?
हसमुख

हाय अमित इम भी अमित ..... क्या आप बता सकते हैं कि जब हम प्रतिक्रिया प्राप्त करते हैं तो हम उनकी तुलना कैसे करते हैं जब हमें प्रतिक्रिया
मिलती है

कैसे अनुरोध संपत्ति के xml में सरणी जोड़ने के लिए?
droidster.me

21

केएसओएपी के साथ मेरी कोशिश थी; मैंने एक सरल तरीका चुना।

एक WSDL फ़ाइल को देखते हुए, प्रत्येक अनुरोध के लिए SOAP अनुरोध टेम्पलेट बनाएं (उदाहरण के लिए: SOAP UI का उपयोग करके) और फिर कोड में पारित किए जाने वाले मानों को प्रतिस्थापित करें। इस डेटा को DefaultHttpClient उदाहरण का उपयोग करके सर्विस एंड पॉइंट पर पोस्ट करें और प्रतिक्रिया स्ट्रीम प्राप्त करें। XML पुल पार्सर का उपयोग करके रिस्पॉन्स स्ट्रीम को पार्स करें।


18

आप WSClient ++ पर एक नज़र डाल सकते हैं


4
अंत में kSoap या SAX
rustyx

मैंने डेमो संस्करण की कोशिश की। एक साधारण सेवा के लिए मेरे लिए काम नहीं किया। इतने $ $ $ $ $ खर्च करने लायक नहीं है।
तुषार

16

मैंने Android प्लेटफ़ॉर्म के लिए एक नया SOAP क्लाइंट बनाया है। यह JAX-WS द्वारा निर्मित इंटरफ़ेस का उपयोग कर रहा है, लेकिन यह अब तक केवल एक सबूत की अवधारणा है।

यदि आप रुचि रखते हैं, तो कृपया उदाहरण देखें और / या AndroidSOAP पर स्रोत देखें ।


1
मुझे JUM XVII में आपकी प्रस्तुति में शामिल होने की खुशी थी। इस Android सामग्री के बारे में बुडापेस्ट। अच्छा काम करते रहें!
pcjuzer

15

यदि आप कर सकते हैं, JSON के लिए जाएं। Android पूर्ण org.json पैकेज के साथ आता है


14

Ksoap2 विधियों को कॉल करें । यह बहुत अच्छा काम करता है।

विवरण सेट करें, जैसे

private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);

envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);

और फिर परिणाम प्राप्त करने के लिए

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


11

कुछ महीने पहले मैं j2ee एप्लिकेशन में jax-ws वेब सेवा के साथ काम कर रहा था, वहां हम WSDL फ़ाइल से WS क्लाइंट स्टब उत्पन्न करने के लिए CXF wsdl2java का उपयोग कर रहे थे और उन क्लाइंट स्टब्स के साथ हमने वेब सेवाओं का उपभोग किया। कुछ हफ्ते पहले, जब मैं एंड्रॉइड प्लेटफॉर्म में उसी तरह से वेब सेवा का उपभोग करने की कोशिश कर रहा था जो मैं नहीं कर सकता था, क्योंकि एंड्रॉइड जार में सभी "जैक्स-डब्ल्यूएस" सहायक कक्षाएं नहीं हैं। उस समय मुझे अपनी आवश्यकता को पूरा करने के लिए ऐसा कोई उपकरण नहीं मिला (यदि मैं कुशलता से Google में विफल नहीं हुआ) -

  • WSDL से क्लाइंट स्टब प्राप्त करें।
  • और सेवा को कुछ तर्क (जावा व्यापार अनुरोध ऑब्जेक्ट) के साथ कॉल करें।
  • रिस्पांस बिजनेस ऑब्जेक्ट प्राप्त करें।

इसलिए, मैंने अपना Android SOAP क्लाइंट जेनरेशन टूल विकसित किया । आपको इन चरणों का पालन करना होगा:

  • WSDL से WS क्लाइंट स्टब प्राप्त करें, इसे अपनी परियोजना में रखें।
  • कुछ सेवा "कॉम्प्लेक्सऑपरेशन सर्विस" के लिए कहें, सेवा को त्वरित करें, समापन बिंदु पोर्ट प्राप्त करें और सेवा पद्धति को कॉल करें, और वेब सेवा से प्रतिक्रिया प्राप्त करें:

उदाहरण के लिए:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • आपको सेवा वर्ग / req / response classes या किसी अन्य वर्ग और विधि के बारे में ध्यान रखने की आवश्यकता नहीं है, क्योंकि आप जानते हैं कि यह सब WSDL से उत्पन्न होता है।
  • और निश्चित रूप से आपको साबुन की कार्रवाई / लिफाफा / नाम स्थान आदि के बारे में पता नहीं होना चाहिए। बस विधि को हम जैसे ही कहते हैं, डेवलपर्स हर समय करते हैं।

क्या आप जानते हैं कि दिनांक से कैसे निपटें? Apache CXF इसका XMLGregorianCalendar में अनुवाद करता है जिसे मैं Android में बनाने में सक्षम नहीं हूं।
मार्टिन नुक

9

मुझे यकीन है कि आप एक्सिस के साथ थोड़ा सा सोप क्लाइंट बना सकते हैं । अक्ष स्थापना निर्देश


2
यह तभी काम करेगा जब अक्ष Android के साथ संगत हो। यह नहीं है (javax के बारे में कुछ। * अक्ष निर्भरता में पैकेज)।
पॉलप्रोग्रामर


6

SOAP विधि द्वारा इन चरणों का पालन करें

WSDL फ़ाइल से,

  • प्रत्येक अनुरोध के लिए SOAP अनुरोध टेम्पलेट बनाएं।

  • फिर कोड में पारित किए जाने वाले मानों को प्रतिस्थापित करें।

  • इस डेटा को DefaultHttpClient उदाहरण का उपयोग करके सेवा अंत बिंदु पर पोस्ट करें।

  • प्रतिक्रिया स्ट्रीम और अंत में प्राप्त करें

  • XML पुल पार्सर का उपयोग करके रिस्पॉन्स स्ट्रीम को पार्स करें।



6

मेरे लिए सबसे आसान तरीका सभी आवश्यक कक्षाओं को उत्पन्न करने के लिए अच्छे उपकरण का उपयोग करना है। व्यक्तिगत रूप से मैं इस साइट का उपयोग करता हूं:

http://easywsdl.com/

यह काफी जटिल वेब सेवाओं का समर्थन करता है और ksoap2 का उपयोग करता है।


5

मैं एक बहुत उपयोगी उपकरण की जाँच करने का सुझाव दूंगा जिससे मुझे बहुत मदद मिली। जो लोग उस परियोजना की देखभाल करते थे, वे बहुत मददगार थे। www.wsdl2code.com/


5

यदि आपको Android में वेब सेवा को कॉल करने में समस्या हो रही है तो आप नीचे दिए गए कोड का उपयोग करके वेब सेवा को कॉल कर सकते हैं और प्रतिक्रिया प्राप्त कर सकते हैं। सुनिश्चित करें कि आपकी वेब सेवा डेटा तालिका प्रारूप में प्रतिक्रिया लौटाती है। यदि आप SQL सर्वर डेटाबेस से डेटा का उपयोग कर रहे हैं तो यह कोड आपकी मदद करेगा । यदि आप MYSQL का उपयोग कर रहे हैं, तो आपको केवल एक चीज को बदलने की आवश्यकता है शब्द NewDataSet को DocumentElementobj2=(SoapObject) obj1.getProperty("NewDataSet"); द्वारा वाक्य से प्रतिस्थापित करें

void callWebService(){ 

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

अगर आपको इससे संबंधित कोई समस्या है तो आप मुझे लिख सकते हैं।


4

कृपया अपने प्रोजेक्ट के साथ SOAP लाइब्रेरी फ़ाइल डाउनलोड करें और जोड़ें। फ़ाइल का नाम: ksoap2-android-विधानसभा-3.4.0-जार-साथ-निर्भरताएँ

एप्लिकेशन को साफ़ करें और फिर प्रोग्राम शुरू करें

यहाँ SOAP सेवा कॉल के लिए कोड है

    String SOAP_ACTION = "YOUR_ACTION_NAME";
    String METHOD_NAME = "YOUR_METHOD_NAME";
    String NAMESPACE = "YOUR_NAME_SPACE";
    String URL = "YOUR_URL";
    SoapPrimitive resultString = null;

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

        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("SOAP Result", "Result Celsius: " + resultString);
    } catch (Exception ex) {
        Log.e("SOAP Result", "Error: " + ex.getMessage());
    }
    if(resultString != null) {
        return resultString.toString();
    }
    else{
        return "error";
    }

परिणाम JSONObject या JSONArray या स्ट्रिंग हो सकते हैं

आपके बेहतर संदर्भ के लिए, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

धन्यवाद।


3

यह एंड्रॉइड में SOAP वेब सेवाओं का उपभोग करने का एक कार्यशील उदाहरण है।

** नोट :: *** अपने प्रोजेक्ट में ADD ksoap2.jar को न भूलें और AndroidManifest फ़ाइल में INTERNET अनुमति भी जोड़ें *

public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
public final String METHOD_NAME = "FahrenheitToCelsius";
public final String PROPERTY_NAME = "Fahrenheit";
public final String SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
public final String SOAP_ADDRESS = "http://www.w3schools.com/webservices/tempconvert.asmx";


private class TestAsynk extends AsyncTask<String, Void, String> {

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        Toast.makeText(getApplicationContext(),
                String.format("%.2f", Float.parseFloat(result)),
                Toast.LENGTH_SHORT).show();
    }

    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                METHOD_NAME);
        request.addProperty(PROPERTY_NAME, params[0]);

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

        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(
                SOAP_ADDRESS);
        Object response = null;
        try {

            androidHttpTransport.call(SOAP_ACTION, envelope);
            response = envelope.getResponse();
            Log.e("Object response", response.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return response.toString();
    }
}

कृपया इस मुद्दे पर मेरी मदद करें stackoverflow.com/questions/41573829/…
Edijae Crusar

3

आप कुछ शीर्ष लेखों के साथ http पर पोस्ट के रूप में साबुन कॉल कर सकते हैं। मैंने बिना अतिरिक्त पुस्तकालयों के इस सवाल को ksoap2 की तरह हल किया। यहाँ पर साबुन सेवा से आदेश प्राप्त करने का लाइव कोड है

private static HashMap<String,String> mHeaders = new HashMap<>();

static {
    mHeaders.put("Accept-Encoding","gzip,deflate");
    mHeaders.put("Content-Type", "application/soap+xml");
    mHeaders.put("Host", "35.15.85.55:8080");
    mHeaders.put("Connection", "Keep-Alive");
    mHeaders.put("User-Agent","AndroidApp");
    mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
    int status=0;
    String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
            "   <soap:Header/>\n" +
            "   <soap:Body>\n" +
            "      <ser:GetAllOrdersOfShipment>\n" +
            "         <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
            "      </ser:GetAllOrdersOfShipment>\n" +
            "   </soap:Body>\n" +
            "</soap:Envelope>";
    StringBuffer chaine = new StringBuffer("");

    HttpURLConnection connection = null;
    try {
        URL url = new URL(stringUrlShipments);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
        connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");

        for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            connection.setRequestProperty(key,value);

        }

        connection.setRequestMethod("POST");
        connection.setDoInput(true);

        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(xmlstring.getBytes("UTF-8"));
        outputStream.close();

        connection.connect();
        status = connection.getResponseCode();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        Log.i("HTTP Client", "HTTP status code : " + status);
    }

    InputStream inputStream = null;
    try {
        inputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return inputStream;
}

कृपया यहां मदद करें stackoverflow.com/questions/41573829/…
एडिजे क्रूसर

इस पर दो प्रश्न: 1. इसे मुख्य गतिविधि से कैसे बुलाया जाता है? 2. StringUrlShipment का मान क्या होना चाहिए जो एक पैरामीटर के रूप में पारित किया गया है?
तोरी

उपरोक्त टिप्पणी पर, प्रश्न # 1 पर ध्यान न दें।
तोरी

मुख्य गतिविधि से आपको इस कोड को कॉल करने के लिए AsyncTask का उपयोग करना चाहिए। इस AsyncTask वर्ग के अंदर इस कोड को लॉन्च करने के लिए doInBackground को लागू करें
लैपेंकोव व्लादिमीर

2

Android से SOAP वेब सेवा को कॉल करने के लिए, इस क्लाइंट का उपयोग करने का प्रयास करें

अपने जावा निर्माण पथ में ADD ksoap2-android.jar को न भूलें

public class WsClient {
    private static final String SOAP_ACTION = "somme";
    private static final String OPERATION_NAME = "somme";
    private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
    private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";

    public String caclculerSomme() {

        String res = null;
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
        request.addProperty("a", "5");
        request.addProperty("b", "2");

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

        try {
            httpTransport.call(SOAP_ACTION, envelope);
            String result = envelope.getResponse().toString();
            res = result;
            System.out.println("############# resull is :" + result);
        } catch (Exception exception) {
            System.out.println("########### ERRER" + exception.getMessage());
        }

        return res;
    }
}

@ वाजडी एचएच कैसे दाता प्रतिक्रिया परिणाम से रेस रेस की तुलना करें: - सफलता ..... "रिस्पॉन्स = 1 ~ सक्सेसफुल" .... इसलिए हम उस परिणाम की तुलना उस स्थिति से कैसे करते हैं जो सर्वर साइड से हैं ...... ..
अमितशर्मा

1

साबुन Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar) जोड़ें :

सार्वजनिक स्थैतिक स्ट्रिंग Fn_Confirm_CollectMoney_Approval (

        HashMap < String, String > str1,
        HashMap < String, String > str2,
        HashMap < String, String > str3) {

    Object response = null;
    String METHOD_NAME = "CollectMoney";
    String NAMESPACE = "http://xxx/yyy/xxx";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    String SOAP_ACTION = "";

    try {

        SoapObject RequestParent = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapObject Request1 = new SoapObject(NAMESPACE, "req");

        PropertyInfo pi = new PropertyInfo();

        Set mapSet1 = (Set) str1.entrySet();

        Iterator mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            String keyValue = (String) mapEntry.getKey();

            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        mapSet1 = (Set) str3.entrySet();

        mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        SoapObject HeaderRequest = new SoapObject(NAMESPACE, "XXX");

        Set mapSet = (Set) str2.entrySet();

        Iterator mapIterator = mapSet.iterator();

        while (mapIterator.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            HeaderRequest.addProperty(pi);
        }

        Request1.addSoapObject(HeaderRequest);

        RequestParent.addSoapObject(Request1);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER10);

        soapEnvelope.dotNet = false;

        soapEnvelope.setOutputSoapObject(RequestParent);

        HttpTransportSE transport = new HttpTransportSE(URL, 120000);

        transport.debug = true;

        transport.call(SOAP_ACTION, soapEnvelope);

        response = (Object) soapEnvelope.getResponse();

        int cols = ((SoapObject) response).getPropertyCount();

        Object objectResponse = (Object) ((SoapObject) response)
                .getProperty("Resp");

        SoapObject subObject_Resp = (SoapObject) objectResponse;


        modelObject = new ResposeXmlModel();

        String MsgId = subObject_Resp.getProperty("MsgId").toString();


        modelObject.setMsgId(MsgId);

        String OrgId = subObject_Resp.getProperty("OrgId").toString();


        modelObject.setOrgId(OrgId);

        String ResCode = subObject_Resp.getProperty("ResCode").toString();


        modelObject.setResCode(ResCode);

        String ResDesc = subObject_Resp.getProperty("ResDesc").toString();


        modelObject.setResDesc(ResDesc);

        String TimeStamp = subObject_Resp.getProperty("TimeStamp")
                .toString();


        modelObject.setTimestamp(ResDesc);

        return response.toString();

    } catch (Exception ex) {

        ex.printStackTrace();

        return null;
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.