Jak wywołać usługę internetową SOAP na Androida [zamknięty]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 3 lata temu .

Popraw to pytanie

Mam duży problem ze znalezieniem dobrych informacji na temat tego, jak zadzwonić do standardowej usługi internetowej SOAP/WSDL z Androidem. Wszystko co udało mi się znaleźć to albo bardzo zawiłe dokumenty i odniesienia do "kSoap2", a potem trochę o parsowaniu tego wszystkiego ręcznie za pomocą SAX . OK, w porządku, ale jest rok 2008, więc pomyślałem, że powinna być jakaś dobra biblioteka do wywoływania standardowych usług internetowych.

Serwis internetowy jest w zasadzie jednym stworzonym w NetBeans . Chciałbym mieć wsparcie IDE dla generowania klas hydraulicznych. Po prostu potrzebuję najprostszego / najbardziej eleganckiego sposobu skontaktowania się z WSDL z telefonu opartego na Androidzie.

Author: Peter Mortensen, 2008-11-18

26 answers

Android nie udostępnia żadnej biblioteki SOAP. Możesz albo napisać własne, albo użyć czegoś w rodzaju kSOAP 2 . Jak zauważyłeś, inni byli w stanie skompilować i używać kSOAP2 w swoich własnych projektach, ale ja nie musiałem.

Google do tej pory nie wykazywało większego zainteresowania dodaniem biblioteki SOAP do Androida. Moje podejrzenie jest takie, że wolą wspierać obecne trendy w usługach internetowych w kierunku usług opartych na REST i używać JSON jako formatu kapsułkowania danych. Lub za pomocą XMPP do przesyłania wiadomości. Ale to tylko domysły.

Usługi internetowe oparte na XML są w tej chwili nieco nietrywialnym zadaniem na Androidzie. Nie znając NetBeans, nie mogę rozmawiać z dostępnymi tam narzędziami, ale Zgadzam się, że powinna być dostępna lepsza biblioteka. Możliwe, że XmlPullParser uchroni Cię przed używaniem SAX - a, ale niewiele o tym wiem.

 249
Author: foxxtrot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 21:50:32

org.apache.http.impl.client.DefaultHttpClient jest domyślnie w Android SDK. Dzięki temu połączysz się z WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
 99
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-06 13:47:07

To prawda, że ze względu na jego napowietrzne SOAP nie jest najlepszym wyborem do wymiany danych z urządzeniami mobilnymi. Możesz jednak znaleźć się w sytuacji, w której nie kontrolujesz formatu wyjścia serwera.

Więc, jeśli musisz trzymać się SOAP, jest biblioteka kSOAP2 załatana dla Androida tutaj:
http://code.google.com/p/ksoap2-android/

 60
Author: Viktor Brešan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-26 13:56:11

Aby zadzwonić do usługi internetowej z urządzenia mobilnego (szczególnie na telefon z Androidem), użyłem bardzo prostego sposobu, aby to zrobić. Nie używałem żadnego API klienta usługi web service przy próbie wywołania usługi web service. Moje podejście jest następujące, aby zadzwonić.

  1. Tworzenie prostego połączenia HTTP przez korzystanie ze standardowego API Java HttpURLConnection.
  2. Formularz Zapytania o mydło. (Możesz zrobić pomoc SOAPUI zrobić mydło Prośba.)
  3. Ustawia znacznik doOutPut jako true.
  4. Ustawianie wartości nagłówka HTTP jak content-długość, treść typ i User-agent. Nie zapomnij aby ustawić wartość Content-length, ponieważ jest to obowiązkowe.
  5. zapisuje całe żądanie SOAP do strumienia wyjściowego.
  6. wywołanie metody nawiązania połączenia i otrzymać odpowiedź (w moim przypadku użyłem getResonseCode).
  7. Jeśli otrzymałeś kod odpowiedzi jako
    1. to znaczy, że udało Ci się zadzwonić do serwisu internetowego.
  8. Teraz weź strumień wejściowy na tym samym Połączenie HTTP i otrzymać obiekt typu string. To obiekt string jest odpowiedź mydła.
  9. Jeśli kod odpowiedzi jest inny niż 200 następnie wybierz ErrorInput strumień na ten sam HTTPobject i otrzymać błąd, jeśli występuje.
  10. przeanalizuj otrzymaną odpowiedź za pomocą Saxparsera (w moim przypadku) lub DOMParaser lub inny parsing mechanizm.

Zaimplementowałem tę procedurę dla telefonu z Androidem i z powodzeniem działa. Jestem w stanie przeanalizować odpowiedź, nawet jeśli jest ona większa niż 700 KB.

 31
Author: Priyanjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-19 23:49:38

SOAP jest źle dostosowaną technologią do użytku na Androidzie (lub urządzeniach mobilnych w ogóle) ze względu na wymagane koszty przetwarzania/parsowania. Usługi wypoczynkowe to lżejsze rozwiązanie i to właśnie proponowałbym. Android jest wyposażony w parser saksofonu i jest dość trywialny w użyciu. Jeśli jesteś absolutnie zobowiązany do obsługi / analizowania SOAP na urządzeniu mobilnym, to współczuję ci, najlepszą radą, jaką mogę zaoferować, jest po prostu nie używać SOAP.

 30
Author: jasonhudgins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 17:04:32

Około rok temu czytałem ten wątek, próbując dowiedzieć się, jak wykonywać połączenia SOAP na Androida - sugestie, aby zbudować własny za pomocą HttpClient zaowocowały zbudowaniem własnej biblioteki SOAP dla Androida:

IceSoap

Zasadniczo pozwala na tworzenie kopert do wysyłania za pośrednictwem prostego Java API, a następnie automatycznie parsuje je do obiektów, które definiujesz za pomocą XPath... na przykład:

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

Staje się:

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

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

Używałem go do własnego projektu, ale pomyślałem, że to może pomóc innym ludziom, więc spędziłem trochę czasu na oddzielaniu tego i dokumentowaniu tego. Naprawdę chciałbym, aby niektóre z Twoich biednych dusz, które natknęły się na ten wątek podczas googlowania "SOAP Android", mogły dać temu szansę i uzyskać jakieś korzyści.

 24
Author: Alex Gilleran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 21:00:37

Nie zapomnij dodać ksoap2.jar w swoim projekcie, a także dodać Uprawnienia internetowe w pliku 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);
        }

    }
}
 24
Author: Amit kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-18 16:53:36

Miałem swoją schadzkę z KSOAP; wybrałem raczej prostsze podejście.

Biorąc pod uwagę plik WSDL, Utwórz szablony żądań SOAP dla każdego żądania (np.: using SOAP UI), a następnie zastąp wartości przekazywane w kodzie. Wyślij te dane do punktu końcowego usługi za pomocą wystąpienia DefaultHttpClient i uzyskaj strumień odpowiedzi. Parse strumień odpowiedzi za pomocą XML Pull parser.

 21
Author: Samuh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 16:10:07

Możesz rzucić okiem na WSClient++

 18
Author: Akash Kava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 08:52:51

Stworzyłem nowego klienta SOAP dla Platformy Android. Używa interfejsu generowanego przez JAX-WS, ale jak na razie jest to tylko proof-of-concept.

Jeśli jesteś zainteresowany, wypróbuj przykład i / lub obejrzyj źródło na AndroidSOAP .

 16
Author: Gábor AUTH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 13:48:36

Jeśli możesz, idź po JSON. Android jest dostarczany z kompletnym org.pakiet json

 15
Author: Yves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-23 15:14:28

Wywołaj metody ksoap2 . Działa bardzo dobrze.

Ustaw szczegóły, jak

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

A następnie aby uzyskać wynik zrób

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
 14
Author: DEVANG SHARMA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 15:49:31
 13
Author: Monte Chan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 13:43:49

Kilka miesięcy temu pracowałem z JAX-WS web service w aplikacji j2ee, tam używaliśmy CXF wsdl2java do generowania stubów klienta Ws z pliku WSDL i z tymi stubami klienta korzystaliśmy z usług internetowych. Kilka tygodni temu, kiedy starałem się konsumować usługę internetową w taki sam sposób na platformie android, nie mogłem, ponieważ android jar nie ma w sobie wszystkich klas wspierających "jax-ws". Tym razem nie znalazłem żadnego takiego narzędzia (jeśli nie udało mi się skutecznie google) do spełnij moje wymagania --

  • Pobierz stub klienta z WSDL.
  • i wywołanie usługi z jakimś argumentem (java business request obiekt).
  • Get the Response Business Object.
Dlatego opracowałem własne narzędzie do generowania klienta Soap na Androida. Gdzie musisz wykonać następujące kroki:
  • z WSDL Pobierz Stub klienta WS, umieść go w swoim projekcie.
  • powiedzmy, że dla jakiejś usługi "ComplexOperationService", Instantiate the Serwis, Pobierz Endpoint port i wywołanie metody service i uzyskanie odpowiedzi z usługi sieci Web:

Eg:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • nie musisz przejmować się klasami service class / req/response lub innymi klasami i metodą, ponieważ wiesz, że wszystkie są generowane z WSDL.
  • i oczywiście nie musisz być świadomy działania soap/envelop / przestrzeni nazw itp. Po prostu zadzwoń do metody, jak my, deweloperzy robią cały czas.
 11
Author: Asraful Haque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-06 15:53:48

Jestem pewien, że mógłbyś zrobić małego klienta mydła z Axis. Instrukcja Instalacji Axis .

 9
Author: branchgabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 13:34:21
 8
Author: Srikanth Naidu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 13:49:39

Wykonaj te kroki metodą SOAP

Z pliku WSDL,

  • Twórz szablony żądań SOAP dla każdego żądania.

  • Następnie zastąp wartości, które mają zostać przekazane w kodzie.

  • Wyślij te dane do punktu końcowego usługi za pomocą wystąpienia DefaultHttpClient.

  • Get the response stream and finally

  • Parse strumień odpowiedzi za pomocą XML Pull parser.

 6
Author: Manick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 09:20:04

Jeśli możesz użyć JSON, jest biała księga, wideo i próbka.kod w Tworzenie usług aplikacyjnych z serwerami PHP i klientami telefonów z systemem Android.

 6
Author: Daniele Teti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-05 13:24:09

Dla mnie najprostszym sposobem jest użycie dobrego narzędzia do generowania wszystkich wymaganych klas. Osobiście korzystam z tej strony:

Http://easywsdl.com/

Obsługuje dość złożone Usługi internetowe i korzysta z ksoap2.

 6
Author: robocik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 06:54:42

Proponuję sprawdzić bardzo przydatne narzędzie, które bardzo mi pomogło. The guys którzy zajmują się tym projektem byli bardzo pomocni. www.wsdl2code.com/

 5
Author: miroslavign,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 06:58:45

Jeśli masz problem z wywołaniem usługi internetowej w Androidzie, to Możesz użyć poniższego kodu, aby zadzwonić do serwisu internetowego i uzyskać odpowiedź. Upewnij się, że usługa internetowa zwraca odpowiedź w formacie tabeli danych ..Ten kod pomoże ci, jeśli korzystasz z danych z bazy danych SQL Server. Jeśli używasz MYSQL musisz zmienić jedną rzecz po prostu zamień słowo NewDataSet ze zdania obj2=(SoapObject) obj1.getProperty("NewDataSet"); na 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
        }
    }

Jeśli masz jakieś problem dotyczący tego możesz napisać do mnie..

 5
Author: Sachin D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-07 10:48:13

Jest to roboczy przykład korzystania z usług internetowych SOAP w Androidzie.

**uwaga:: * * * nie zapomnij dodać ksoap2.jar w projekcie, a także dodać uprawnienia internetowe w pliku 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();
    }
}
 4
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 14:15:36

Pobierz i dodaj plik biblioteki SOAP do swojego projektu Nazwa pliku: ksoap2-android-assembly-3.4.0-jar-with-dependencies

Wyczyść aplikację, a następnie uruchom program

Oto kod do wywołania usługi 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";
    }

Wyniki mogą być JSONObject lub JSONArray lub String

Dla lepszego odniesienia, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Dzięki.
 4
Author: lokesh s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 13:02:13

Możesz wykonywać soap jako post przez http z pewnymi nagłówkami. Rozwiązałem to pytanie bez dodatkowych bibliotek jak ksoap2 Oto kod na żywo otrzymujący zamówienia z serwisu soap

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;
}
 3
Author: Lapenkov Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 05:47:28

Aby wywołać usługę soap z Androida, spróbuj użyć tego klienta

Nie zapomnij dodać ksoap2-android.jar w ścieżce budowania Javy

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;
    }
}
 2
Author: Wajdi Hh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 18:35:19

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

}
 1
Author: Mani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 22:53:16