java - examples - web services شرح




كيفية الاتصال بخدمة SOAP على الويب على نظام Android (18)

لا تنس أن تضيف ksoap2.jar في مشروعك وتضيف أيضًا إذن INTERNET في ملف 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);
        }

    }
}

أواجه صعوبة كبيرة في العثور على معلومات جيدة حول كيفية الاتصال بخدمة ويب SOAP / WSDL قياسية مع Android. كل ما تمكنت من العثور عليه هو إما مستندات معقدة للغاية ومراجع إلى "kSoap2" ، ثم بعض الشيء حول تحليلها يدويًا باستخدام SAX . حسنًا ، هذا جيد ، لكنه في عام 2008 ، لذا برزت أنه يجب أن تكون هناك مكتبة جيدة للاتصال بخدمات الويب القياسية.

خدمة الإنترنت هي فقط واحدة تم إنشاؤها في NetBeans . أود الحصول على دعم IDE لتوليد فصول السباكة. أنا فقط بحاجة إلى أسهل / أكثر طريقة أنيقة للاتصال بخدمة ويب تستند إلى WSDL من هاتف يعمل بنظام Android.


SOAP هي تقنية غير ملائمة للاستخدام على Android (أو أجهزة الجوال بشكل عام) بسبب الحاجة إلى معالجة / تحليل. خدمات REST هي حل أخف وزنا وهذا ما أقترحه. يأتي Android مع محلل SAX ، وهو أمر سهل الاستخدام إلى حد ما. إذا كنت مطالبًا تمامًا بالتعامل مع / تحليل SOAP على جهاز محمول ، فأنا أشعر بالأسف من أجلك ، فأفضل نصيحة يمكنني تقديمها هي عدم استخدام SOAP.


أضف Soap 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;
    }

}



إذا استطعت ، فانتقل إلى JSON. يأتي Android مع حزمة org.json الكاملة


إذا كنت تواجه مشكلة فيما يتعلق باستدعاء خدمة ويب في android ، فيمكنك استخدام الرمز أدناه للاتصال بخدمة الويب والحصول على رد .تأكد من أن خدمة الويب الخاصة بك تقوم بإرجاع الاستجابة في تنسيق جدول البيانات .. تساعدك هذه التعليمات البرمجية إذا كنت تستخدم بيانات من قاعدة بيانات SQL Server . إذا كنت تستخدم MYSQL تحتاج إلى تغيير شيء واحد فقط استبدال الكلمة NewDataSet من الجملة obj2=(SoapObject) obj1.getProperty("NewDataSet"); بواسطة DocumentElement

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

إذا كان لديك أي مشكلة بخصوص هذا يمكنك أن تكتب لي ..


اتبع هذه الخطوات بواسطة طريقة SOAP

من ملف WSDL ،

  • إنشاء قوالب طلب SOAP لكل طلب.

  • ثم استبدل القيم المراد تمريرها في الكود.

  • أرسل هذه البيانات إلى نقطة نهاية الخدمة باستخدام مثيل DefaultHttpClient.

  • الحصول على تيار الاستجابة وأخيرا

  • تحليل "دفق الاستجابة" باستخدام محلل سحب XML.


الرجاء تنزيل وإضافة ملف مكتبة SOAP مع مشروعك اسم الملف: ksoap2-android-assembly-3.4.0-jar-with-dependencies

قم بتنظيف التطبيق ثم قم بتشغيل البرنامج

هنا هو رمز لمكالمة خدمة 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 Or String

للرجوع بشكل أفضل ، https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

شكر.


بالنسبة لي ، أسهل طريقة هي استخدام أداة جيدة لتوليد جميع الفئات المطلوبة. أنا شخصياً أستخدم هذا الموقع:

http://easywsdl.com/

وهو يدعم خدمات الويب معقدة للغاية ويستخدم ksoap2.


قبل بضعة أشهر كنت أعمل مع خدمة ويب jax-ws في تطبيق j2ee ، هناك كنا نستخدم CXF wsdl2java لتوليد كعب عميل WS من ملف WSDL ومع تلك البرامج الصغيرة للعميل قمنا باستهلاك خدمات الويب. قبل بضعة أسابيع ، عندما كنت أحاول أن أستهلك خدمة الويب بنفس الطريقة في نظام Android ، لم أتمكن من ذلك ، لأن جرة الروبوت لا تحتوي على جميع الطبقات "jax-ws" الداعمة لها. في ذلك الوقت لم أجد أي أداة من هذا القبيل (إذا لم أكن قد فشلت في google بكفاءة) لتلبية متطلباتي -

  • الحصول على كعب روتين العميل من WSDL.
  • واستدعاء الخدمة مع بعض الحجة (كائن طلب عمل جافا).
  • الحصول على كائن الأعمال الاستجابة.

لذلك ، طورت أداة إنشاء عميل SOAP الخاص بـ Android . حيث يتعين عليك اتباع هذه الخطوات:

  • من WSDL احصل على WS Web Stub ، ضعه في مشروعك.
  • قل لبعض الخدمات "ComplexOperationService" ، Instantiate الخدمة ، الحصول على منفذ نقطة النهاية واستدعاء طريقة الخدمة ، والحصول على الاستجابة من خدمة ويب:

على سبيل المثال:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • لا تحتاج إلى الاهتمام بفصول خدمة الطبقة / req / response أو أي فصول أخرى والطريقة أيضًا ، كما تعلمون ، يتم تكوينها كلها من WSDL.
  • وبالطبع لا تحتاج إلى أن تكون مدركاً لعمل الصابون / الظرف / مساحة الاسم ، إلخ. فقط اتصل بالطريقة كما نفعل ، مطورو البرامج دائمًا.

كان لي tryst مع KSOAP. اخترت نهج أكثر بساطة.

عند تقديم ملف WSDL ، قم بإنشاء قوالب طلب SOAP لكل طلب (على سبيل المثال: استخدام SOAP UI) ثم قم باستبدال القيم المراد تمريرها في الكود. أرسل هذه البيانات إلى نقطة نهاية الخدمة باستخدام مثيل DefaultHttpClient واحصل على تدفق الاستجابة. تحليل "دفق الاستجابة" باستخدام محلل سحب XML.


لقد قمت بإنشاء عميل SOAP جديد لمنصة Android. وهي تستخدم واجهة JAX-WS التي تم إنشاؤها ، ولكنها ليست سوى دليل على المفهوم حتى الآن.

إذا كنت مهتمًا ، فيرجى تجربة المثال و / أو مشاهدة المصدر على AndroidSOAP .


للاتصال بخدمة ويب SOAP من Android ، حاول استخدام هذا العميل

لا تنس أن تضيف 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;
    }
}

منذ عام تقريبًا كنت أقرأ هذا الموضوع في محاولة لمعرفة كيفية إجراء مكالمات SOAP على Android - أدت الاقتراحات الخاصة ببناء حسابي باستخدام 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;
}

كنت أستخدمه لمشروعي الخاص لكني حسبت أنه قد يساعد بعض الأشخاص الآخرين لذا قضيت بعض الوقت في فصله وتوثيقه. أنا حقا أحب ذلك إذا كان بعض من النفوس الفقيرة التي تتعثر في هذا الموضوع أثناء googling "SOAP Android" يمكن أن يعطيها الذهاب والحصول على بعض الفوائد.


هذا هو مثال عملي لاستهلاك خدمات الويب SOAP في الروبوت.

** ملاحظة :: *** لا تنسى إضافة 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();
    }
}

يمكنك إلقاء نظرة على WSClient++


يأتي org.apache.http.impl.client.DefaultHttpClient في Android SDK افتراضيًا. هذا سوف يجعلك على اتصال بـ WSDL.

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




wsdl