java - एंड्रॉइड पर एसओएपी वेब सेवा कैसे कॉल करें




android web-services (18)

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

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);
        }

    }
}

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

वेब सेवा मूल रूप से NetBeans में बनाई गई है। मैं नलसाजी कक्षाओं के निर्माण के लिए आईडीई समर्थन करना चाहता हूं। मुझे एंड्रॉइड आधारित फोन से WSDL आधारित वेब सेवा से संपर्क करने का सबसे आसान / सबसे शानदार तरीका चाहिए।



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

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

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


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

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

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


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

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

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

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

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

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



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

http://easywsdl.com/

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


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


मैंने एंड्रॉइड मंच के लिए एक नया एसओएपी क्लाइंट बनाया है। यह एक जेएक्स-डब्ल्यूएस जेनरेट इंटरफ़ेस का उपयोग कर रहा है, लेकिन यह अभी तक केवल एक सबूत-अवधारणा है।

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



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

शून्य कॉलवेब सेवा () {

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
        }
    }

यदि आपको इसके बारे में कोई समस्या है तो आप मुझे लिख सकते हैं ..


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

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

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();
    }
}

लगभग एक साल पहले मैं यह थ्रेड पढ़ रहा था कि एंड्रॉइड पर एसओएपी कॉल कैसे करें - एचटीपी क्लाइंट का उपयोग करके अपना खुद का निर्माण करने के सुझावों के परिणामस्वरूप मुझे एंड्रॉइड के लिए अपनी स्वयं की एसओएपी लाइब्रेरी का निर्माण हुआ:

IceSoap

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

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

हो जाता है:

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

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

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


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

डब्ल्यूएसडीएल फ़ाइल से,

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

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

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

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

  • एक XML पुल पार्सर का उपयोग कर प्रतिक्रिया स्ट्रीम पार्स।


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

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

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();






wsdl