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

553

Mam dużo problemów ze znalezieniem dobrych informacji na temat wywoływania standardowej usługi internetowej SOAP / WSDL za pomocą Androida. Wszystko, co udało mi się znaleźć, to albo bardzo skomplikowane 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ć dobra biblioteka do wywoływania standardowych usług internetowych.

Serwis internetowy to po prostu usługa stworzona w NetBeans . Chciałbym mieć wsparcie IDE do generowania klas hydraulicznych. Potrzebuję tylko najłatwiejszego / najbardziej eleganckiego sposobu skontaktowania się z usługą internetową opartą na WSDL z telefonu z systemem Android.

BobbyShaftoe
źródło
Oto bardzo dobry link do korzystania z SOAP w Androidzie
Jainendra
Jeśli ktoś wcześniej znał MS VS, użycie Mono dla Androida rozwiąże wiele problemów z usługami danych i usługami internetowymi, wszystko jest proste i szybkie. Również, kto nie zna C # (kod bardzo podobny do Java), cała biblioteka ma te same metody, niektóre funkcje zastąpiono właściwościami, więc nazwy są prawie takie same i kto napisał wcześniej w Javie dla Androida, może bardzo łatwo wykorzystać swoje doświadczenie do pisania c # kod.
Eugene Bosikov
Spójrz na poniższy link, który zawiera szczegółowy przykład dotyczący dostępu do usługi internetowej w systemie Android za pomocą Ksoap2 Dostęp do usługi internetowej z systemu Android
Fred Ondieki
Wierzę, że jest to możliwe dzięki Xamarin / C # przy użyciu .Net Core. patrz blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri
To narzędzie firmy Spring wygląda obiecująco.
Louis,

Odpowiedzi:

245

Android nie zapewnia żadnej biblioteki SOAP. Możesz napisać własny lub użyć czegoś takiego jak kSOAP 2 . Jak zauważyłeś, inni byli w stanie skompilować i używać kSOAP2 we własnych projektach, ale nie musiałem.

Do tej pory Google wykazało niewielkie zainteresowanie dodaniem biblioteki SOAP do Androida. Podejrzewam, że wolą wspierać obecne trendy w usługach sieciowych w kierunku usług opartych na REST i używać JSON jako formatu enkapsulacji danych. Lub używając XMPP do przesyłania wiadomości. Ale to tylko przypuszczenie.

Usługi sieciowe oparte na XML są w tej chwili nieco trywialnym zadaniem dla Androida. 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 uratuje cię przed użyciem SAX, ale niewiele o tym wiem.

foxxtrot
źródło
7
Tak, myślę, że będę musiał zbudować serwer proxy REST. Wydaje się dość dziwne, że Google nie jest zainteresowany wsparciem SOAP. Wypróbowałem metodę kSoap, to naprawdę nie jest nawet poważna alternatywa. Jest to w najlepszym razie brzydka sprawa, która wymaga dużo przeszukiwania grup dyskusyjnych.
BobbyShaftoe
19
Powodem jest prawdopodobnie to, że SOAP jest bardzo gadatliwy i nie spełnia dobrze ograniczeń mobilnego przetwarzania.
Neil
92
Ta odpowiedź zostałaby poprawiona, gdyby ktoś mógł zasugerować najlepszą alternatywę dla dzwonienia do usług internetowych za pomocą aplikacji na Androida. Gdy ludzie znajdą to pytanie i je przeczytają, większość z nich będzie tego szukać.
MGOwen,
4
Przetwarzanie SOAP wymaga również dużej ilości pamięci i procesora w porównaniu do bardziej zwięzłego formatu, takiego jak JSON.
Jeremy Edwards,
3
@MGOwen Najlepszą alternatywą, jaką widzę, jest serwer proxy. Zaimplementuj interfejs REST, który pośredniczy w kopertach SOAP za pośrednictwem WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClientdomyślnie jest dołączony do zestawu SDK systemu Android. Dzięki temu uzyskasz połączenie 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);
Neil
źródło
5
Tak, to byłaby trasa, na której musiałbym ręcznie parsować wszystko, nie dostałbym podejścia obiektowego.
BobbyShaftoe
93
Masz na myśli, że nie dostaniesz darmowego lunchu. Ręczne analizowanie nie ma nic wspólnego z OO. Mógłbym parsować wszystko na papierze za pomocą mojego najbardziej zaawansowanego narzędzia, jakim jest ołówek HB1, i nadal byłby to OO.
Neil
8
Uważam, że autor miał na myśli powiązanie Java-XML. Jaki byłby twój następny krok w tym podejściu do analizy odpowiedzi? A jeśli ma setki elementów zorganizowanych w strukturę drzewa?
rustyx
12
BTW, oczekiwałbym przynajmniej HTTP POST, a nie GET, jeśli chcesz mieć szczęście z SOAP. Gdzie są też nagłówki Accept i SOAPAction? Jeśli naprawdę chcesz przejść na komandos, zajmie to znacznie więcej niż te 4 linie, aby skorzystać z usługi SOAP.
rustyx
6
@NeilD: Co się stanie, jeśli okoliczności zmuszą cię do korzystania z SOAP, np. Serwer WWW używa SOAP i nie masz nad tym kontroli?
Bjarke Freund-Hansen
59

To prawda, że ​​ze względu na narzut SOAP nie jest najlepszym wyborem do wymiany danych z urządzeniami mobilnymi. Jednak możesz znaleźć się w sytuacji, w której nie kontrolujesz formatu danych wyjściowych serwera.

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

Viktor Brešan
źródło
31

Aby zadzwonić do usługi internetowej z urządzenia mobilnego (zwłaszcza na telefonie z Androidem), użyłem bardzo prostego sposobu, aby to zrobić. Nie użyłem żadnego interfejsu API klienta usługi sieci Web w celu wywołania usługi sieci Web. Moje podejście jest następujące, aby wykonać połączenie.

  1. Utwórz proste połączenie HTTP za pomocą standardowego interfejsu API języka Java HttpURLConnection.
  2. Utwórz żądanie SOAP. (Możesz pomóc SOAPUI, aby złożyć żądanie SOAP).
  3. Ustaw flagę doOutPut jako true.
  4. Ustaw wartości nagłówka HTTP, takie jak długość treści, typ zawartości i agent użytkownika. Nie zapomnij ustawić wartości długości treści, ponieważ jest to obowiązkowe.
  5. Napisz całe żądanie SOAP do strumienia wyjściowego.
  6. Wywołaj metodę, aby nawiązać połączenie i otrzymać odpowiedź (w moim przypadku użyłem getResonseCode).
  7. Jeśli otrzymałeś kod odpowiedzi jako
    1. Oznacza to, że udało ci się połączyć z serwisem internetowym.
  8. Teraz weź strumień wejściowy na tym samym połączeniu HTTP i otrzymaj obiekt string. Ten obiekt ciągu jest odpowiedzią SOAP.
  9. Jeśli kod odpowiedzi jest inny niż 200, weź ErrorInputstrumień na tym samym obiekcie HTTP i otrzymaj błąd, jeśli taki istnieje.
  10. Analizuj otrzymaną odpowiedź za pomocą SAXParser (w moim przypadku) lub DOMParaser lub dowolnego innego mechanizmu analizującego.

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

Priyanjan
źródło
30

SOAP jest nieodpowiednią technologią do użytku na Androidzie (lub ogólnie urządzeniach mobilnych) z powodu wymaganego narzutu przetwarzania / parsowania. Usługi REST to rozwiązanie lżejsze i to właśnie sugerowałbym. Android jest wyposażony w parser SAX i jest dość trywialny w użyciu. Jeśli jesteś absolutnie zobowiązany do obsługi / parsowania SOAP na urządzeniu mobilnym, jest mi przykro z tego powodu, najlepszą radą, jaką mogę zaoferować, jest po prostu nie używać SOAP.

jasonhudgins
źródło
2
W piekle jest specjalne miejsce dla tych, którzy zmuszają programistów do korzystania z usług SOAP zamiast interfejsu API REST.
Hitesh Sahu
24

Około rok temu czytałem ten wątek, próbując dowiedzieć się, jak wykonywać połączenia SOAP na Androidzie - sugestie dotyczące tworzenia własnych przy użyciu HttpClient spowodowały, że zbudowałem własną bibliotekę SOAP dla Androida:

IceSoap

Zasadniczo pozwala budować koperty do wysłania za pomocą prostego interfejsu API języka Java, a następnie automatycznie analizuje je na obiekty zdefiniowane 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 może to pomóc innym osobom, więc poświęciłem trochę czasu na jego rozdzielenie i udokumentowanie. Bardzo by mi się podobało, gdyby niektóre z twoich biednych dusz, które natknęły się na ten wątek podczas przeglądania Google „SOAP Android”, mogły spróbować i uzyskać jakąś korzyść.

Alex Gilleran
źródło
pracowałeś z uwierzytelnianiem sesji na IceSoap?
Adnen Chouibi
24

NIE ZAPOMNIJ, ABY DODAĆ plik ksoap2.jar w swoim projekcie, a także dodać uprawnienie INTERNET 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);
        }

    }
}
Amit Kumar
źródło
HttpTransportSE gdzie mogę dostać tę klasę?
Noman
Witaj, używam twojego kodu, ale pojawia się następujący błąd, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Błąd; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = Wymagane jest uwierzytelnienie sprzedawcy; }; }; }; } czy możesz mi pomóc?
Hasmukh,
cześć Amit im też amit ..... Czy możesz mi powiedzieć, jak porównujemy odpowiedź, kiedy otrzymaliśmy odpowiedź, czy nie, więc jak i jakie warunki, aby sprawdzić odpowiedź ......
Amitsharma
jak dodać tablicę w XML właściwości żądania?
droidster.me,
21

Miałem schadzkę z KSOAP; Wybrałem raczej prostsze podejście.

Biorąc pod uwagę plik WSDL, utwórz szablony Żądań SOAP dla każdego Żądania (na przykład: za pomocą interfejsu SOAP), a następnie zastąp wartości przekazywane w kodzie. Wyślij te dane do punktu końcowego usługi przy użyciu wystąpienia DefaultHttpClient i uzyskaj strumień odpowiedzi. Analizuj strumień odpowiedzi za pomocą analizatora składni XML Pull.

Samuh
źródło
18

Możesz zajrzeć na WSClient ++

Akash Kava
źródło
4
Wreszcie pierwsza przydatna odpowiedź po powtórzeniu
kSoap
Próbowałem wersji demo. Nie działało dla mnie dla prostej usługi. Nie warto wydawać tak wielu $$$$$.
Tushar
16

Utworzyłem nowego klienta SOAP dla platformy Android. Używa interfejsu wygenerowanego przez JAX-WS, ale jak dotąd jest to tylko dowód słuszności koncepcji.

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

Gábor AUTH
źródło
1
Miałem przyjemność uczestniczyć w prezentacji na JUM XVII. Budapeszt o tych sprawach z Androidem. Tak trzymaj!
pcjuzer
15

Jeśli możesz, wybierz JSON. Android jest dostarczany z kompletnym pakietem org.json

Yves
źródło
14

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

Ustaw szczegóły, takie 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 zrobić wynik

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
DEVANG SHARMA
źródło
11

Kilka miesięcy temu pracowałem z usługą internetową jax-ws w aplikacji j2ee. Tam użyliśmy CXF wsdl2java do wygenerowania kodu pośredniczącego klienta WS z pliku WSDL, a za pomocą kodów pośredniczących korzystaliśmy z usług internetowych. Kilka tygodni temu, kiedy próbowałem korzystać z usługi internetowej w taki sam sposób na platformie Android, nie mogłem, ponieważ w słoiku Androida nie ma wszystkich klas obsługujących „jax-ws”. Tym razem nie znalazłem żadnego takiego narzędzia (jeśli nie udało mi się skutecznie googleować), aby spełnić moje wymagania -

  • Pobierz kod klienta z WSDL.
  • I wywołaj usługę z pewnym argumentem (obiekt żądania biznesowego Java).
  • Uzyskaj obiekt biznesowy odpowiedzi.

Opracowałem więc własne narzędzie do generowania klienta SOAP dla systemu Android . Gdzie musisz wykonać następujące kroki:

  • Z WSDL Pobierz skrót klienta WS, umieść go w swoim projekcie.
  • Powiedz dla niektórych usług „ComplexOperationService”, utwórz instancję usługi, uzyskaj port punktu końcowego i wywołaj metodę usługi oraz uzyskaj odpowiedź z usługi sieci Web:

na przykład:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Nie musisz przejmować się klasą usługi / wymaganiem / klasami odpowiedzi ani żadnymi innymi klasami i metodą, ponieważ wiesz, że wszystkie są generowane z WSDL.
  • I oczywiście nie musisz zdawać sobie sprawy z działania mydła / obwiedni / przestrzeni nazw itp. Wystarczy wywołać tę metodę, jak my, programiści, cały czas.
Asraful Haque
źródło
Czy wiesz, jak radzić sobie z Data? Apache CXF przetłumaczy go na XMLGregorianCalendar, którego nie jestem w stanie stworzyć w Androidzie.
Martin Nuc,
9

Jestem pewien, że możesz stworzyć małego klienta SOAP za pomocą Axis . Instrukcja instalacji osi .

branchgabriel
źródło
2
Działałoby to tylko wtedy, gdy oś była kompatybilna z Androidem. To nie jest (coś o pakietach javax. * W zależnościach od osi).
PaulProgrammer,
6

Wykonaj następujące kroki metodą SOAP

Z pliku WSDL

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

  • Następnie zastąp wartości przekazywane w kodzie.

  • Wyślij te dane do punktu końcowego usługi przy użyciu instancji DefaultHttpClient.

  • Uzyskaj strumień odpowiedzi i wreszcie

  • Analizuj strumień odpowiedzi za pomocą analizatora składni XML Pull.

Manick
źródło
6

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

http://easywsdl.com/

Obsługuje dość złożone usługi sieciowe i używa ksoap2.

robocik
źródło
5

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

miroslavign
źródło
5

Jeśli masz problem z wywołaniem usługi sieciowej w systemie Android, możesz użyć poniższego kodu, aby zadzwonić do usługi sieci Web i uzyskać odpowiedź. Upewnij się, że usługa sieci Web zwraca odpowiedź w formacie tabeli danych. Ten kod pomoże ci, jeśli używasz danych z bazy danych SQL Server . Jeśli używasz MYSQL , musisz zmienić jedną rzecz, po prostu zamień słowo NewDataSet z 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 jakiś problem, możesz do mnie napisać ..

Sachin D.
źródło
4

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 zgłoszenia serwisowego 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";
    }

Wynikiem może być JSONObject lub JSONArray Or String

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

Dzięki.

lokesh s
źródło
3

To jest działający przykład korzystania z usług sieciowych SOAP w Androidzie.

** Uwaga :: *** NIE ZAPOMNIJ, ABY DODAĆ plik ksoap2.jar w swoim projekcie, a także dodać uprawnienie do INTERNETU 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();
    }
}
Bieg
źródło
pomóżcie mi w tej sprawie stackoverflow.com/questions/41573829/...
Edijae Crusar
3

Możesz wykonać połączenie mydlane jako post przez http z pewnymi nagłówkami. Rozwiązałem to pytanie bez dodatkowych bibliotek, takich jak ksoap2 Oto kod na żywo otrzymujący zamówienia z usługi mydlanej

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
źródło
proszę o pomoc tutaj stackoverflow.com/questions/41573829/...
Edijae Crusar
dwa pytania na ten temat: 1. Jak to się nazywa od głównej działalności? 2. Jaka powinna być wartość StringUrlShipment przekazywana jako parametr?
Tori
na powyższy komentarz zignoruj ​​pytanie nr 1.
Tori
Z głównej aktywności powinieneś użyć AsyncTask, aby wywołać ten kod. Wewnątrz tej klasy AsyncTask zaimplementuj doInBackground, aby uruchomić ten kod
Lapenkov Vladimir
2

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

NIE ZAPOMNIJ DODAĆ pliku ksoap2-android.jar na ścieżce kompilacji Java

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
źródło
@ Wajdi hh jak porównać odpowiedź res od wyniku odpowiedzi dawcy: - sukces ..... "responce = 1 ~ Successfull" .... więc jak porównujemy ten wynik z warunków, które są po stronie serwera ...... ..
Amitsharma
1

Dodaj mydło 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
źródło