Cara memanggil layanan web SOAP di Android [ditutup]

553

Saya mengalami banyak kesulitan menemukan informasi yang baik tentang cara memanggil layanan web SOAP / WSDL standar dengan Android. Yang saya dapat temukan adalah dokumen yang sangat berbelit-belit dan referensi ke "kSoap2" dan kemudian sedikit tentang penguraian semuanya secara manual dengan SAX . OK, tidak apa-apa, tapi ini tahun 2008, jadi saya pikir harus ada perpustakaan yang bagus untuk memanggil layanan web standar.

Layanan web pada dasarnya hanya satu yang dibuat di NetBeans . Saya ingin mendapat dukungan IDE untuk membuat kelas pipa ledeng. Saya hanya perlu cara termudah / paling elegan untuk menghubungi layanan web berbasis WSDL dari ponsel berbasis Android.

BobbyShaftoe
sumber
Berikut ini tautan yang sangat baik tentang penggunaan SOAP di android: Cara Memanggil Layanan Web di Android Menggunakan SOAP
Jainendra
Jika seseorang yang sebelumnya akrab dengan MS VS, menggunakan Mono untuk Android akan menyelesaikan banyak masalah dengan layanan data dan layanan web, semuanya sederhana dan perkembangannya cepat. Juga yang tidak terbiasa dengan C # (kode sangat mirip dengan Java), semua pustaka memiliki metode yang sama, beberapa fungsi diganti pada properti, sehingga nama yang hampir sama dan yang menulis sebelumnya di Jawa untuk android dapat dengan mudah menggunakan pengalaman mereka untuk menulis c # kode.
Eugene Bosikov
Lihat di bawah Tautan ini memiliki Eaxample rinci tentang mengakses layanan web di Android Menggunakan Ksoap2 Mengakses layanan Web dari Android
Fred Ondieki
Saya percaya ini dimungkinkan dengan Xamarin / C # menggunakan .Net Core. lihat blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri
Alat ini oleh Spring terlihat menjanjikan.
Louis

Jawaban:

245

Android tidak menyediakan perpustakaan SOAP apa pun. Anda bisa menulis sendiri, atau menggunakan sesuatu seperti kSOAP 2 . Seperti yang Anda perhatikan, orang lain dapat mengkompilasi dan menggunakan kSOAP2 dalam proyek mereka sendiri, tetapi saya tidak harus melakukannya.

Google telah menunjukkan, sampai saat ini, sedikit minat dalam menambahkan pustaka SOAP ke Android. Kecurigaan saya untuk ini adalah bahwa mereka lebih suka mendukung tren saat ini dalam Layanan Web menuju layanan berbasis REST, dan menggunakan JSON sebagai format enkapsulasi data. Atau, menggunakan XMPP untuk olahpesan. Tapi itu hanya dugaan saja.

Layanan web berbasis XML adalah tugas yang agak tidak sepele pada Android saat ini. Tidak tahu NetBeans, saya tidak bisa berbicara dengan alat yang tersedia di sana, tapi saya setuju bahwa perpustakaan yang lebih baik harus tersedia. Mungkin saja XmlPullParser akan menyelamatkan Anda dari menggunakan SAX, tapi saya tidak tahu banyak tentang itu.

foxxtrot
sumber
7
Ya, saya pikir saya harus membangun proxy REST. Tampaknya sangat aneh bahwa Google tidak tertarik memberikan dukungan SOAP. Saya mencoba metode kSoap, itu bahkan bukan alternatif yang serius. Paling-paling, ini adalah yang buruk yang membutuhkan banyak penjelajahan newsgroup.
BobbyShaftoe
19
Alasannya mungkin karena SOAP sangat verbose dan tidak melayani kendala komputasi mobile dengan baik.
Neil
92
Jawaban ini akan ditingkatkan jika seseorang dapat menyarankan alternatif terbaik untuk memanggil layanan web dengan Aplikasi Android. Begitu orang menemukan pertanyaan ini dan membacanya, itulah yang sebagian besar dari mereka akan cari.
MGOwen
4
Pemrosesan SOAP juga membutuhkan memori dan prosesor yang intensif dibandingkan dengan format yang lebih ringkas seperti JSON.
Jeremy Edwards
3
@ MGOwen Alternatif terbaik yang bisa saya lihat adalah proxy. Menerapkan antarmuka REST-ful yang proksi amplop SOAP melalui WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClienthadir di Android SDK secara default. Itu akan membuat Anda terhubung ke WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
Neil
sumber
5
Ya, ini akan menjadi rute di mana saya harus mem-parsing semuanya secara manual, saya tidak akan mendapatkan pendekatan berorientasi objek.
BobbyShaftoe
93
Maksudmu kamu tidak akan mendapatkan makan siang gratis. Penguraian manual tidak ada hubungannya dengan OO. Saya dapat menguraikan semuanya di atas kertas dengan alat paling canggih saya menjadi pensil HB1 dan itu masih akan menjadi OO.
Neil
8
Saya percaya oleh OO penulis berarti Java-XML binding. Apa yang akan menjadi langkah Anda selanjutnya dalam pendekatan ini untuk mengurai respons? Dan jika memiliki ratusan elemen, diorganisasikan dalam struktur pohon?
rustyx
12
BTW, saya harapkan setidaknya HTTP POST bukan GET jika Anda ingin beruntung dengan SOAP. Juga, di mana tajuk Terima dan SOAPAction? Jika Anda benar-benar ingin menjalankan komando, dibutuhkan lebih dari 4 baris ini untuk menggunakan layanan SOAP.
rustyx
6
@NeilD: Bagaimana jika Anda dipaksa oleh keadaan untuk menggunakan SOAP, misalnya server web menggunakan SOAP dan Anda belum mengontrol ini?
Bjarke Freund-Hansen
59

Memang benar bahwa karena SOAP overhead bukan pilihan terbaik untuk pertukaran data dengan perangkat mobile. Namun, Anda mungkin menemukan diri Anda dalam situasi di mana Anda tidak mengontrol format output server.

Jadi, jika Anda harus tetap menggunakan SOAP, ada perpustakaan kSOAP2 yang ditambal untuk Android di sini:
http://code.google.com/p/ksoap2-android/

Viktor Brešan
sumber
31

Untuk memanggil layanan web dari perangkat seluler (terutama pada ponsel Android), saya telah menggunakan cara yang sangat sederhana untuk melakukannya. Saya belum pernah menggunakan API klien layanan web dalam upaya untuk memanggil layanan web. Pendekatan saya adalah sebagai berikut untuk melakukan panggilan.

  1. Buat koneksi HTTP sederhana dengan menggunakan API standar Java HttpURLConnection.
  2. Membentuk permintaan SOAP. (Anda dapat membantu SOAPUI untuk membuat permintaan SOAP.)
  3. Setel flag doOutPut sebagai true.
  4. Atur nilai header HTTP seperti panjang konten, tipe konten, dan agen pengguna. Jangan lupa untuk mengatur nilai panjang Konten karena itu wajib.
  5. Tulis seluruh permintaan SOAP ke aliran output.
  6. Panggil metode untuk membuat koneksi dan menerima respons (Dalam kasus saya, saya menggunakan getResonseCode).
  7. Jika Anda menerima kode respons sebagai
    1. Itu berarti Anda berhasil memanggil layanan web.
  8. Sekarang ambil aliran input pada koneksi HTTP yang sama dan terima objek string. Objek string ini adalah respons SOAP.
  9. Jika kode responsnya selain 200 maka ambil ErrorInputstreaming pada objek HTTP yang sama dan terima kesalahannya jika ada.
  10. Parsir respons yang diterima menggunakan SAXParser (dalam kasus saya) atau DOMParaser atau mekanisme penguraian lainnya.

Saya telah menerapkan prosedur ini untuk ponsel Android, dan berhasil dijalankan. Saya dapat menguraikan respons bahkan jika lebih dari 700 KB.

Priyanjan
sumber
30

SOAP adalah teknologi yang tidak sesuai untuk digunakan pada Android (atau perangkat seluler pada umumnya) karena pemrosesan / penguraian overhead yang diperlukan. Layanan REST adalah solusi yang lebih ringan dan itulah yang saya sarankan. Android hadir dengan SAX parser, dan cukup sepele untuk digunakan. Jika Anda benar-benar diharuskan untuk menangani / mengurai SOAP pada perangkat seluler maka saya merasa kasihan kepada Anda, saran terbaik yang dapat saya tawarkan adalah tidak menggunakan SOAP.

jasonhudgins
sumber
2
Ada tempat khusus di neraka bagi mereka yang memaksa pengembang untuk menggunakan layanan SOAP alih-alih REST API.
Hitesh Sahu
24

Sekitar setahun yang lalu saya membaca utas ini mencoba mencari tahu bagaimana melakukan panggilan SOAP di Android - saran untuk membangun sendiri menggunakan HttpClient membuat saya membangun perpustakaan SOAP saya sendiri untuk Android:

IceSoap

Pada dasarnya itu memungkinkan Anda untuk membangun amplop untuk dikirim melalui Java API sederhana, kemudian secara otomatis mem-parsingnya menjadi objek yang Anda tentukan melalui XPath ... misalnya:

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

Menjadi:

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

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

Saya menggunakannya untuk proyek saya sendiri tetapi saya pikir itu mungkin membantu beberapa orang lain jadi saya telah menghabiskan waktu untuk memisahkan dan mendokumentasikannya. Saya benar-benar akan menyukainya jika beberapa jiwa malang Anda yang tersandung pada utas ini saat googling "SOAP Android" bisa mencobanya dan mendapatkan manfaat.

Alex Gilleran
sumber
apakah Anda bekerja dengan sesi Authentification on IceSoap?
Adnen Chouibi
24

JANGAN LUPA MENAMBAH ksoap2.jar di proyek Anda dan juga menambahkan izin INTERNET di file 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);
        }

    }
}
Amit kumar
sumber
HttpTransportSE di mana saya bisa mendapatkan kelas ini ??
Noman
Halo, saya menggunakan kode Anda tetapi saya mendapatkan kesalahan berikut, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = Diperlukan Otentikasi Merchant .; }; }; }; } Bisakah Anda menolong saya?
Hasmukh
hai Amit im juga amit ..... Dapatkah Anda memberi tahu saya bagaimana tanggapan kami membandingkan ketika kami mendapat tanggapan berhasil atau tidak jadi bagaimana dan kondisi apa untuk memeriksa tanggapan ......
Amitsharma
bagaimana cara menambahkan array di xml dari properti permintaan?
droidster.me
21

Saya pernah kencan dengan KSOAP; Saya memilih pendekatan yang lebih sederhana.

Diberikan file WSDL, buat templat Permintaan SOAP untuk setiap Permintaan (untuk misalnya: menggunakan SOAP UI) dan kemudian gantilah nilai-nilai yang akan diteruskan dalam kode. POST data ini ke titik akhir layanan menggunakan instance DefaultHttpClient dan dapatkan aliran respons. Parsing Stream Respons menggunakan parser Tarik XML.

Samuh
sumber
18

Anda dapat melihat WSClient ++

Akash Kava
sumber
4
Akhirnya jawaban yang berguna pertama setelah mengulangi baik kSoap atau SAX
rustyx
Saya mencoba versi demo. Tidak bekerja untuk saya untuk layanan sederhana. Apakah tidak layak menghabiskan begitu banyak $$$$$.
Tushar
16

Saya telah membuat klien SOAP baru untuk platform Android. Ini menggunakan antarmuka yang dihasilkan JAX-WS, tetapi sejauh ini hanya merupakan bukti konsep.

Jika Anda tertarik, silakan coba contoh dan / atau tonton sumbernya di AndroidSOAP .

Gábor AUTH
sumber
1
Saya merasa senang menghadiri presentasi Anda di JUM XVII. Budapest tentang hal-hal Android ini. Pertahankan kerja bagus!
pcjuzer
15

Jika Anda bisa, pilih JSON. Android hadir dengan paket org.json lengkap

Yves
sumber
14

Hubungi ksoap2 metode . Ini bekerja dengan sangat baik.

Atur detail, seperti

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

dan kemudian untuk mendapatkan hasilnya lakukan

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
DEVANG SHARMA
sumber
11

Beberapa bulan yang lalu saya bekerja dengan layanan web jax-ws di aplikasi j2ee, Di sana kami menggunakan CXF wsdl2java untuk menghasilkan tulisan rintisan klien WS dari file WSDL dan dengan potongan-potongan klien kami mengkonsumsi layanan web. Beberapa minggu yang lalu, ketika saya mencoba untuk mengkonsumsi layanan web dengan cara yang sama di platform android saya tidak bisa, karena jar android tidak memiliki semua "jax-ws" kelas pendukung di dalamnya. Waktu itu saya tidak menemukan alat seperti itu (jika saya tidak gagal google efisien) untuk memenuhi kebutuhan saya -

  • Dapatkan rintisan klien dari WSDL.
  • Dan panggil Layanan dengan beberapa argumen (objek permintaan bisnis java).
  • Dapatkan Objek Bisnis Respons.

Jadi, saya mengembangkan Alat Pembuatan Klien SABUN Android sendiri . Di mana Anda harus mengikuti langkah-langkah ini:

  • Dari WSDL Dapatkan WS Client Stub, Masukkan ke proyek Anda.
  • Katakan untuk Beberapa Layanan "ComplexOperationService", Instantiate Layanan, Dapatkan port Endpoint dan panggil metode layanan, dan dapatkan respons dari layanan Web:

misalnya:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Anda tidak perlu peduli dengan kelas layanan / req / kelas respons atau kelas lain dan metode juga, karena Anda tahu semua itu dihasilkan dari WSDL.
  • Dan tentu saja Anda tidak perlu menyadari tindakan sabun / amplop / namespace dll. Cukup panggil metode seperti kami, pengembang lakukan sepanjang waktu.
Haque Asraful
sumber
Apakah Anda tahu cara menangani Date? Apache CXF menerjemahkannya ke XMLGregorianCalendar yang tidak dapat saya buat di Android.
Martin Nuc
9

Saya yakin Anda bisa membuat klien SOAP kecil dengan Axis . Instruksi pemasangan sumbu .

branchgabriel
sumber
2
Itu hanya akan berfungsi jika sumbu kompatibel dengan Android. Bukan (sesuatu tentang javax. * Paket dalam dependensi sumbu).
PaulProgrammer
6

Ikuti langkah-langkah ini dengan metode SOAP

Dari file WSDL,

  • buat Templat Permintaan SABUN untuk setiap Permintaan.

  • Kemudian gantilah nilai-nilai yang akan diberikan dalam kode.

  • POST data ini ke titik akhir layanan menggunakan instance DefaultHttpClient.

  • Dapatkan aliran respons dan akhirnya

  • Parsing Stream Respons menggunakan parser Tarik XML.

Manick
sumber
6

Bagi saya cara termudah adalah dengan menggunakan alat yang bagus untuk menghasilkan semua kelas yang diperlukan. Secara pribadi saya menggunakan situs ini:

http://easywsdl.com/

Ini mendukung layanan web yang cukup kompleks dan menggunakan ksoap2.

robocik
sumber
5

Saya akan menyarankan memeriksa alat yang sangat berguna yang banyak membantu saya. Orang-orang yang mengurus proyek itu juga sangat membantu. www.wsdl2code.com/

miroslavign
sumber
5

Jika Anda mengalami masalah saat memanggil Layanan Web di android maka Anda dapat menggunakan kode di bawah ini untuk menghubungi layanan web dan mendapatkan respons. Pastikan bahwa layanan web Anda mengembalikan respons dalam Format Tabel Data .. Kode ini akan membantu Anda jika Anda menggunakan data dari database SQL Server . Jika Anda menggunakan MYSQL, Anda perlu mengubah satu hal cukup ganti kata NewDataSet dari kalimat obj2=(SoapObject) obj1.getProperty("NewDataSet");dengan 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
        }
    }

Jika Anda memiliki masalah tentang ini, Anda dapat menulis saya ..

Sachin D
sumber
4

Silakan unduh dan tambahkan file perpustakaan SOAP dengan Nama File proyek Anda: ksoap2-android-assembly-3.4.0-jar-with-dependencies

Bersihkan aplikasi dan kemudian mulai program

Berikut adalah kode untuk panggilan layanan 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";
    }

Hasilnya mungkin JSONObject atau JSONArray Atau String

Untuk referensi Anda yang lebih baik, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Terima kasih.

lokesh s
sumber
3

Ini adalah contoh kerja dari mengkonsumsi layanan web SOAP di android.

** Catatan :: *** JANGAN LUPA MENAMBAHKAN ksoap2.jar dalam proyek Anda dan juga menambahkan izin INTERNET dalam file 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();
    }
}
Arun
sumber
tolong bantu saya dalam masalah ini stackoverflow.com/questions/41573829/…
Edijae Crusar
3

Anda dapat melakukan panggilan sabun sebagai posting di http dengan tajuk tertentu. Saya memecahkan pertanyaan ini tanpa perpustakaan tambahan seperti ksoap2. Berikut adalah kode langsung menerima pesanan dari layanan sabun

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;
}
Lapenkov Vladimir
sumber
tolong bantu di sini stackoverflow.com/questions/41573829/…
Edijae Crusar
dua pertanyaan tentang ini: 1. Bagaimana ini dipanggil dari kegiatan utama? 2. Apa yang seharusnya menjadi nilai StringUrlShipment yang dilewatkan sebagai parameter?
Tori
pada komentar di atas, abaikan pertanyaan # 1.
Tori
Dari aktivitas utama Anda harus menggunakan AsyncTask untuk memanggil kode ini. Di dalam kelas AsyncTask ini mengimplementasikan doInBackground untuk meluncurkan kode ini
Lapenkov Vladimir
2

Untuk memanggil Layanan web SOAP dari android, coba gunakan klien ini

JANGAN LUPA MENAMBAH ksoap2-android.jar di java build path Anda

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;
    }
}
Wajdi Hh
sumber
@ Wajdi hh bagaimana membandingkan respons respons dari hasil respons pemberi: - sukses ..... "responsce = 1 ~ Successfull" .... jadi bagaimana kita membandingkan hasil dari kondisi yang berasal dari sisi server ...... ..
Amitsharma
1

Tambahkan Soap Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar):

public static String 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;
    }

}
Mani
sumber