Android'de bir SOAP web servisi nasıl aranır [kapalı]


553

Android ile standart bir SOAP / WSDL web servisini nasıl arayacağınız hakkında iyi bilgiler bulmakta çok sorun yaşıyorum. Bulabildiğim tek şey çok kıvrımlı belgeler ve "kSoap2" ye referanslar ve ardından bunları SAX ile manuel olarak ayrıştırma konusunda biraz . Tamam, bu iyi, ama 2008, bu yüzden standart web servislerini aramak için iyi bir kütüphane olması gerektiğini düşündüm.

Web hizmeti temel olarak NetBeans'te oluşturulmuş bir hizmettir . Sıhhi tesisat sınıflarının oluşturulması için IDE desteğine sahip olmak istiyorum. Android tabanlı bir telefondan WSDL tabanlı bir web servisiyle iletişim kurmanın en kolay / zarif yoluna ihtiyacım var .


İşte android SOAP kullanma konusunda çok iyi bir bağlantı: Android SOAP kullanarak Web Servisini Arama
Jainendra

Daha önce MS VS'ye aşina olan bir kişi, Mono for Android'i kullanmak veri hizmetleri ve web hizmetleri ile ilgili birçok sorunu çözecekse, her şey basit ve hızlı bir gelişmedir. Ayrıca kim C # (kod Java çok benzer) aşina değil, tüm kütüphane aynı yöntemlere sahiptir, bazı işlevler özellikleri değiştirildi, bu yüzden isimleri hemen hemen aynı ve daha önce android için Java üzerinde yazdı c # yazmak için deneyimlerini kullanarak çok kolay olabilir kodu.
Eugene Bosikov

Aşağıdaki linke bir göz atın Android'de bir web servisine erişme hakkında
Fred Ondieki

Bunun .NET Core kullanarak Xamarin / C # ile mümkün olduğuna inanıyorum. bkz. blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri

Spring tarafından bu araç umut verici görünüyor.
Louis

Yanıtlar:


245

Android herhangi bir SOAP kütüphanesi sağlamaz. Kendinizinkini yazabilir veya kSOAP 2 gibi bir şey kullanabilirsiniz. . Belirttiğiniz gibi, diğerleri kendi projelerinde kSOAP2'yi derleyebildi ve kullanabildi, ama zorunda kalmadım.

Google, bugüne kadar Android'e bir SOAP kütüphanesi eklemek konusunda çok az ilgi gösterdi. Bunun için şüphem REST tabanlı hizmetlere yönelik Web Trendlerindeki mevcut eğilimleri ve veri kapsülleme biçimi olarak JSON'u kullanmayı tercih etmeleridir. Veya mesajlaşma için XMPP kullanma. Ama bu sadece bir varsayım.

XML tabanlı web hizmetleri şu anda Android'de biraz önemsiz bir görevdir. NetBeans bilmeden, orada mevcut araçlarla konuşamıyorum, ancak daha iyi bir kütüphane olması gerektiğini kabul ediyorum. XmlPullParser size SAX kullanmaktan kurtarabilir, ancak bu konuda fazla bir şey bilmiyorum.


7
Evet, sanırım bir REST proxy'si oluşturmak zorunda kalacağım. Google'ın SOAP desteği sağlamakla ilgilenmemesi oldukça garip görünüyor. KSoap yöntemini denedim, gerçekten ciddi bir alternatif değil. En iyi ihtimalle, haber gruplarının çok fazla araştırılmasını gerektiren çirkin bir şeydi.
BobbyShaftoe

19
Bunun nedeni muhtemelen SOAP'ın çok ayrıntılı olması ve mobil bilgi işlemin kısıtlamalarına iyi hizmet etmemesidir.
Neil

92
Birisi bir Android Uygulaması ile web hizmetlerini aramak için en iyi alternatifi önerebilirse bu cevap geliştirilecektir . İnsanlar bu soruyu bulup okuduktan sonra, çoğu bunu arayacaktır.
MGOwen

4
SOAP işleme, JSON gibi daha özlü bir biçime kıyasla bellek ve işlemci yoğun bir işlemdir.
Jeremy Edwards

3
@MGOwen Görebildiğim en iyi alternatif proxy. WSDL2Java aracılığıyla SOAP zarflarını temsil eden bir REST-ful arabirimi uygulayın.

99

org.apache.http.impl.client.DefaultHttpClientvarsayılan olarak Android SDK'sında gelir. Bu sizi WSDL'ye bağlar.

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

5
Evet, bu, her şeyi manuel olarak ayrıştırmam gereken yol olurdu, nesne yönelimli bir yaklaşım elde edemezdim.
BobbyShaftoe

93
Yani ücretsiz bir öğle yemeği alamazsın. Manuel ayrıştırma işleminin OO ile bir ilgisi yoktur. HB1 kalem olan en gelişmiş aletimle kağıt üzerindeki her şeyi ayrıştırabilirdim ve yine de OO olurdu.
Neil

8
OO tarafından yazarın Java-XML bağlaması anlamına geldiğine inanıyorum. Yanıtı ayrıştırmak için bu yaklaşımdaki bir sonraki adımınız ne olur? Ve eğer bir ağaç yapısında organize edilmiş yüzlerce element varsa?
rustyx

12
BTW, SOAP ile herhangi bir şans istiyorsanız en az bir HTTP POST GET değil beklenir. Ayrıca, Accept ve SOAPAction başlıkları nerede? Eğer gerçekten komando gitmek istiyorsanız, bir SOAP hizmeti tüketmek için bu 4 satırdan çok daha fazla zaman alacaktır.
rustyx

6
@NeilD: Koşullar nedeniyle SOAP kullanmaya zorlandıysanız, örneğin web sunucusu SOAP kullanıyorsa ve bunun üzerinde kontrolünüz yoksa?
Bjarke Freund-Hansen

59

Tepegöz SOAP'ın mobil cihazlarla veri alışverişi için en iyi seçim olmadığı doğrudur. Ancak, sunucu çıktısının biçimini denetlemediğiniz durumlarda kendinizi bulabilirsiniz.

Yani, SOAP ile uğraşmanız gerekiyorsa, burada Android için yamalı bir kSOAP2 kütüphanesi var:
http://code.google.com/p/ksoap2-android/


31

Bir web cihazını bir mobil cihazdan (özellikle bir Android telefonda) aramak için bunu yapmanın çok basit bir yolunu kullandım. Web servisini aramak için herhangi bir web servisi istemci API'sı kullanmadım. Bir görüşme yapmak için yaklaşımım aşağıdaki gibidir.

  1. Java standart API'sini kullanarak basit bir HTTP bağlantısı oluşturun HttpURLConnection.
  2. Bir SOAP isteği oluşturun. (Bir SOAP isteği yapmak için SOAPUI'den yardım alabilirsiniz.)
  3. DoOutPut bayrağını true olarak ayarlayın.
  4. İçerik uzunluğu, İçerik türü ve Kullanıcı aracısı gibi HTTP başlık değerlerini ayarlayın. İçerik uzunluğu değerini zorunlu olduğu için ayarlamayı unutmayın.
  5. SOAP isteğinin tamamını çıktı akışına yazın.
  6. Bağlantı kurmak ve yanıtı almak için yöntemi çağırın (Benim durumumda kullandım getResonseCode ).
  7. Yanıt kodunuzu aldıysanız
    1. Bu, web servisini aramayı başardığınız anlamına gelir.
  8. Şimdi aynı HTTP bağlantısında bir girdi akışı alın ve string nesnesini alın. Bu dize nesnesi bir SOAP yanıtıdır.
  9. Yanıt kodu 200'den farklıysa, ErrorInput farklıysa, aynı HTTP nesnesinde akış alın ve varsa hatayı alın.
  10. Alınan yanıtı SAXParser (benim durumumda) veya DOMParaser veya başka bir ayrıştırma mekanizması kullanarak ayrıştırın.

Bu işlemi Android telefon için uyguladım ve başarıyla çalışıyor. 700 KB'den büyük olsa bile yanıtı ayrıştırabiliyorum.


30

SOAP, gerekli işleme / ayrıştırma yükü nedeniyle Android'de (veya genel olarak mobil cihazlarda) kullanım için uygun olmayan bir teknolojidir. Bir REST hizmetleri daha hafif bir çözümdür ve bunu öneririm. Android bir SAX ayrıştırıcı ile birlikte gelir ve kullanımı oldukça önemsizdir. Bir mobil cihazda SOAP'ı kesinlikle kullanmanız / ayrıştırmanız gerekiyorsa, o zaman sizin için üzülüyorum, sunabileceğim en iyi tavsiye sadece SABUN'u kullanmamaktır.


2
Geliştiricileri REST API yerine SOAP hizmetlerini kullanmaya zorlayanlar için cehennemde özel bir yer var.
Hitesh Sahu

24

Yaklaşık bir yıl önce Android'de SOAP çağrılarının nasıl yapılacağını anlamaya çalışırken bu konuyu okuyordum - HttpClient kullanarak kendi oluşturmak için öneriler Android için kendi SOAP kütüphanemi oluşturmama neden oldu:

IceSoap

Temel olarak, basit bir Java API yoluyla göndermek için zarflar oluşturmanıza izin verir, ardından bunları otomatik olarak XPath aracılığıyla tanımladığınız nesnelere ayrıştırır ... örneğin:

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

Oluyor:

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

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

Kendi projem için kullanıyordum ama bazı insanlara yardımcı olabileceğini düşündüm, bu yüzden ayırmak ve belgelemek için biraz zaman harcadım. Eğer "SOAP Android" googling sırasında bu iş parçacığı üzerinde yanılmak bazı fakir ruhlar bazı gitmek ve biraz fayda elde eğer gerçekten çok isterim.


IceSoap'ta Kimlik Doğrulama oturumu ile çalıştınız mı?
Adnen Chouibi

24

Projenize ksoap2.jar EKLEMEYİ UNUTMAYIN ve ayrıca AndroidManifest dosyasına İNTERNET izni ekleyin

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 bu sınıfı nereden alabilirim?
Noman

Merhaba, kodunuzu kullanıyorum ama aşağıdaki hatayı alıyorum, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {sonuçKodu = Hata; mesajları = birtür {MessagesTypeMessage = birtür {kod = E00014; text = Satıcı Kimlik Doğrulaması gerekiyor .; }; }; }; } lütfen bana yardım edebilir misin?
Hasmukh

merhaba Amit im de amit ..... u yanıt aldığımızda nasıl cevap biz cevap karşılaştırmak başarılı ya da değil nasıl ve nasıl ve hangi yanıtı kontrol etmek için koşulları kontrol ......
Amitsharma

istek özelliği xml dizisi nasıl eklenir?
droidster.me

21

KSOAP ile uğraştım; Daha basit bir yaklaşım seçtim.

Bir WSDL dosyası verildiğinde, her İstek için SOAP İsteği şablonları oluşturun (örneğin: SOAP kullanıcı arabirimini kullanarak) ve sonra kodda iletilecek değerleri değiştirin. DefaultHttpClient örneğini kullanarak bu verileri hizmet bitiş noktasına POST yapın ve yanıt akışını alın. Bir XML Çekme ayrıştırıcısı kullanarak Yanıt Akışı'nı ayrıştırın.


18

WSClient ++ ' a bir göz atabilirsiniz


4
Sonunda kSoap veya SAX'ı tekrarladıktan sonra ilk faydalı cevap
rustyx

Demo sürümünü denedim. Basit bir hizmet için benim için çalışmadı. O kadar çok $$$$$ harcamaya değer değil.
Tushar

16

Android platformu için yeni bir SOAP istemcisi oluşturdum. JAX-WS tarafından üretilen bir arayüz kullanıyor, ancak şimdiye kadar sadece bir kavram kanıtı.

Eğer ilgileniyorsanız, lütfen örneği deneyin ve / veya kaynağı AndroidSOAP'ta izleyin .


1
JUM XVII'deki sunumunuza katılmaktan zevk aldım. Budapeşte bu Android şeyler hakkında. İyi işlere devam edin!
pcjuzer

15

Yapabiliyorsanız, JSON'a gidin. Android, eksiksiz org.json paketiyle geliyor


14

Ksoap2 yöntemlerini çağırın . Çok iyi çalışıyor.

Ayrıntıları ayarlayın.

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

ve sonra sonucu elde etmek için

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


11

Birkaç ay önce j2ee uygulamasında jax-ws web servisi ile çalışıyordum , WSDL dosyasından WS istemci saplaması oluşturmak için CXF wsdl2java kullanıyorduk ve bu web sunucularını kullandığımız istemci saplamaları ile. Birkaç hafta önce, android platformunda aynı şekilde web servisini kullanmaya çalışırken, yapamadım, çünkü android kavanozun içinde "jax-ws" destekleyici sınıfların hepsi yok. O zaman ihtiyacımı karşılamak için böyle bir araç bulamadım (verimli bir şekilde google'da başarısız olsaydım) -

  • WSDL'den istemci saplamasını alın.
  • Ve Servisi bir argümanla (java iş talebi nesnesi) arayın.
  • Yanıt İş Nesnesini Alın.

Bu yüzden kendi Android SOAP İstemci Oluşturma Aracımı geliştirdim . Bu adımları izlemeniz gereken yerler:

  • WSDL'den WS Client Stub'ı edinin, projenize koyun.
  • Bazı Hizmetler için "ComplexOperationService" deyin, Hizmeti başlatın, Bitiş Noktası bağlantı noktasını alın ve hizmet yöntemini çağırın ve Web hizmetinden yanıt alın:

Örneğin:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Tümünün WSDL'den üretildiğini bildiğiniz gibi, hizmet sınıfı / req / response sınıfları veya diğer sınıflar ve yöntem hakkında da bakım yapmanız gerekmez.
  • Ve elbette sabun eyleminin / zarfın / ad alanının vb. Farkında olmanıza gerek yok. Sadece yöntemi biz çağırıyoruz, geliştiriciler her zaman yapıyor.

Date ile nasıl başa çıkacağınızı biliyor musunuz? Apache CXF, Android'de oluşturamadığım XMLGregorianCalendar'e çevirir.
Martin Nuc



6

SOAP yöntemiyle bu adımları izleyin

WSDL dosyasından,

  • her İstek için SOAP İstek şablonları oluşturun.

  • Daha sonra kodda iletilecek değerleri değiştirin.

  • DefaultHttpClient örneği kullanarak bu verileri hizmet bitiş noktasına POST.

  • Yanıt akışını alın ve son olarak

  • Bir XML Çekme ayrıştırıcısı kullanarak Yanıt Akışı'nı ayrıştırın.



6

Benim için en kolay yol, gerekli tüm sınıfları oluşturmak için iyi bir araç kullanmaktır. Şahsen bu siteyi kullanıyorum:

http://easywsdl.com/

Oldukça karmaşık web servislerini destekler ve ksoap2 kullanır.


5

Bana çok yardımcı olan çok kullanışlı bir araca bakmanızı öneririm. Bu projeyle ilgilenen çocuklar da çok yardımcı oldular. www.wsdl2code.com/


5

Android'de Web Hizmeti'ni arama konusunda sorun yaşıyorsanız, web servisini aramak ve yanıt almak için aşağıdaki kodu kullanabilirsiniz. SQL Server veritabanından veri kullanıyorsanız , web hizmetinizin yanıtı Veri Tablosu Formatında döndürdüğünden emin olun. Bu kod size yardımcı olacaktır . MYSQL kullanıyorsanız, bir şeyi değiştirmeniz yeterlidir , sadece NewDataSet kelimesini DocumentElement tarafından cümle ile değiştirin obj2=(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
        }
    }

Bununla ilgili herhangi bir sorunuz olursa bana yazabilirsiniz ..


4

Lütfen projenizi Dosya Adı ile SOAP kütüphane dosyasını indirin ve ekleyin: ksoap2-android-assembly-3.4.0-jar-bağımlılıkları ile

Uygulamayı temizleyin ve ardından programı başlatın

SOAP servis çağrısı kodu

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

Sonuçlar JSONObject veya JSONArray veya String olabilir

Daha iyi referansınız için https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Teşekkürler.


3

Bu android SOAP web hizmetleri tüketen çalışan bir örnektir.

** Not :: *** Projenize ksoap2.jar EKLEMEYİ UNUTMAYIN ve ayrıca AndroidManifest dosyasına İNTERNET izni ekleyin *

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

lütfen bu konuda bana yardım et stackoverflow.com/questions/41573829/…
Edijae Crusar

3

Sabun çağrısını belirli başlıklar ile http üzerinden posta olarak yapabilirsiniz. Bu soruyu ksoap2 gibi ek kütüphaneler olmadan çözdüm İşte canlı kod sabun servisinden sipariş alıyor

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


bu konuda iki soru: 1. Buna ana faaliyetten nasıl bahsediliyor? 2. Parametre olarak iletilen StringUrlShipment değeri ne olmalıdır?
Tori

yukarıdaki yorumda 1. soruya aldırmayın.
Tori

Ana etkinlikten bu kodu çağırmak için AsyncTask kullanmalısınız. Bu AsyncTask sınıfının içinde bu kodu başlatmak için doInBackground uygulandı
Lapenkov Vladimir

2

Android'den bir SOAP web servisini aramak için bu istemciyi kullanmayı deneyin

Java oluşturma yolunuza ksoap2-android.jar EKLEMEYİ UNUTMAYIN

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 vericiyi yanıt sonucu yanıt res karşılaştırmak için nasıl: - başarı ..... "responce = 1 ~ Başarılı" .... yani nasıl sunucu tarafında olan koşuldan bu sonucu karşılaştırmak ...... ..
Amitsharma

1

Sabun Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar) ekleyin :

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.