Como chamar um serviço da web SOAP no Android [fechado]

553

Estou com muita dificuldade para encontrar boas informações sobre como chamar um serviço Web SOAP / WSDL padrão com o Android. Tudo o que consegui encontrar são documentos muito complicados e referências ao "kSoap2" e, em seguida, um pouco sobre como analisar tudo manualmente com o SAX . OK, tudo bem, mas é 2008, então imaginei que deveria haver uma boa biblioteca para chamar serviços da Web padrão.

O serviço da web é basicamente um criado no NetBeans . Eu gostaria de ter suporte a IDE para gerar as classes de encanamento. Eu só preciso da maneira mais fácil / elegante de entrar em contato com um serviço Web baseado em WSDL a partir de um telefone Android.

BobbyShaftoe
fonte
Aqui é muito bom link usando SOAP no android: Como chamada de serviço Web no Android usando SOAP
Jainendra
Se alguém anteriormente familiarizado com o MS VS, o uso do Mono para Android resolverá muitos problemas com serviços de dados e serviços da Web, tudo é simples e rápido. Além disso, quem não está familiarizado com o C # (código muito semelhante ao Java), toda a biblioteca possui os mesmos métodos, algumas funções substituídas nas propriedades; portanto, nomes quase iguais e que escreveu antes no Java para Android podem ser muito fáceis usando sua experiência para escrever c # código.
Eugene Bosikov
Dê uma olhada no link abaixo. Ele contém um Eaxample detalhado sobre o acesso a um serviço da web no Android usando o Ksoap2 Acessando um serviço da
Fred Ondieki
Acredito que isso seja possível com o Xamarin / C # usando o .Net Core. consulte blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri 18/6
Essa ferramenta da Spring parece promissora.
Louis

Respostas:

245

O Android não fornece nenhum tipo de biblioteca SOAP. Você pode escrever por conta própria ou usar algo como o kSOAP 2 . Como você observa, outras pessoas foram capazes de compilar e usar o kSOAP2 em seus próprios projetos, mas eu não precisei.

Até o momento, o Google demonstrou pouco interesse em adicionar uma biblioteca SOAP ao Android. Minha suspeita é que eles preferem dar suporte às tendências atuais de serviços da Web em relação a serviços baseados em REST e usar JSON como um formato de encapsulamento de dados. Ou, usando o XMPP para mensagens. Mas isso é apenas conjectura.

No momento, os serviços da Web baseados em XML são uma tarefa pouco trivial no Android. Não conhecendo o NetBeans, não posso falar com as ferramentas disponíveis lá, mas concordo que uma biblioteca melhor esteja disponível. É possível que o XmlPullParser o salve do SAX, mas não sei muito sobre isso.

foxxtrot
fonte
7
Sim, acho que vou ter que criar um proxy REST. Parece bastante estranho que o Google não tenha interesse em fornecer suporte SOAP. Eu tentei o método kSoap, não é mesmo uma alternativa séria. É, na melhor das hipóteses, um fato feio que requer muita lavagem de grupos de notícias.
BobbyShaftoe
19
O motivo é provavelmente que o SOAP é muito detalhado e não atende bem às restrições da computação móvel.
284 Neil
92
Essa resposta seria melhorada se alguém pudesse sugerir a melhor alternativa para chamar serviços da Web com um aplicativo Android. Quando as pessoas encontram e leem essa pergunta, é o que a maioria delas procura.
MGOwen
4
O processamento SOAP também consome muita memória e processador em comparação com um formato mais conciso como o JSON.
Jeremy Edwards
3
@MGOwen A melhor alternativa que vejo é um proxy. Implemente uma interface REST-cheia que proxies os envelopes SOAP através do WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClientvem no Android SDK por padrão. Isso conectará você ao 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
fonte
5
Sim, essa seria a rota em que eu teria que analisar tudo manualmente, não obteria uma abordagem orientada a objetos.
BobbyShaftoe
93
Você quer dizer que você não receberá um almoço grátis. A análise manual não tem nada a ver com OO. Eu poderia analisar tudo no papel com a minha ferramenta mais avançada sendo um lápis HB1 e ainda seria OO.
214 Neil
8
Creio que por OO o autor quis dizer ligação Java-XML. Qual seria o seu próximo passo nesta abordagem para analisar a resposta? E se tiver centenas de elementos, organizados em uma estrutura de árvore?
Rustyx
12
BTW, eu esperaria pelo menos um HTTP POST e não um GET se você quiser ter alguma sorte com o SOAP. Além disso, onde estão os cabeçalhos Accept e SOAPAction? Se você realmente deseja usar o comando, serão necessárias muito mais do que essas 4 linhas para consumir um serviço SOAP.
Rustyx
6
@ NeilD: E se você fosse forçado pelas circunstâncias a usar SOAP, por exemplo, o servidor da web usa SOAP e você não tem controle sobre isso?
Bjarke Freund-Hansen
59

É verdade que, devido à sobrecarga, o SOAP não é a melhor opção para troca de dados com dispositivos móveis. No entanto, você pode se encontrar em uma situação em que não controla o formato da saída do servidor.

Portanto, se você precisa seguir o SOAP, há uma biblioteca do kSOAP2 corrigida para Android aqui:
http://code.google.com/p/ksoap2-android/

Viktor Brešan
fonte
31

Para chamar um serviço da Web de um dispositivo móvel (especialmente em um telefone Android), usei uma maneira muito simples de fazer isso. Eu não usei nenhuma API do cliente de serviço da web na tentativa de chamar o serviço da web. Minha abordagem é a seguinte para fazer uma ligação.

  1. Crie uma conexão HTTP simples usando a API padrão Java HttpURLConnection.
  2. Forme uma solicitação SOAP. (Você pode ajudar o SOAPUI a fazer uma solicitação SOAP.)
  3. Defina o sinalizador doOutPut como true.
  4. Defina os valores do cabeçalho HTTP, como comprimento do conteúdo, tipo de conteúdo e agente do usuário. Não se esqueça de definir o valor do comprimento do conteúdo, pois é obrigatório.
  5. Escreva toda a solicitação SOAP no fluxo de saída.
  6. Chame o método para fazer uma conexão e receber a resposta (no meu caso, eu usei getResonseCode).
  7. Se o seu código de resposta recebido como
    1. Isso significa que você conseguiu ligar para o serviço web.
  8. Agora pegue um fluxo de entrada na mesma conexão HTTP e receba o objeto string. Este objeto de sequência é uma resposta SOAP.
  9. Se o código de resposta for diferente de 200, pegue um ErrorInputfluxo no mesmo objeto HTTP e receba o erro, se houver.
  10. Analise a resposta recebida usando SAXParser (no meu caso) ou DOMParaser ou qualquer outro mecanismo de análise.

Eu implementei este procedimento para o telefone Android e ele está sendo executado com êxito. Consigo analisar a resposta, mesmo que tenha mais de 700 KB.

Priyanjan
fonte
30

O SOAP é uma tecnologia inadequada para uso no Android (ou dispositivos móveis em geral) devido à sobrecarga de processamento / análise necessária. Os serviços REST são uma solução mais leve e é isso que eu sugeriria. O Android vem com um analisador SAX e é bastante simples de usar. Se você é absolutamente necessário para manipular / analisar o SOAP em um dispositivo móvel, sinto muito por você, o melhor conselho que posso oferecer é não usar o SOAP.

jasonhudgins
fonte
2
Há um lugar especial no inferno para aqueles que forçam os desenvolvedores a usar serviços SOAP em vez da API REST.
Hitesh Sahu
24

Há cerca de um ano, eu estava lendo este tópico tentando descobrir como fazer chamadas SOAP no Android - as sugestões para criar meu próprio usando HttpClient resultaram na criação de minha própria biblioteca SOAP para Android:

IceSoap

Basicamente, permite criar envelopes para enviar por meio de uma API Java simples e, em seguida, os analisa automaticamente em objetos que você define via XPath ... por exemplo:

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

Torna-se:

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

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

Eu estava usando-o para o meu próprio projeto, mas achei que isso poderia ajudar outras pessoas, então passei algum tempo separando-o e documentando-o. Eu realmente adoraria se algumas de suas pobres almas que tropeçam nesse tópico enquanto pesquisavam no "SOAP Android" pudessem tentar e obter algum benefício.

Alex Gilleran
fonte
você trabalhou com a autenticação da sessão no IceSoap?
Adnen Chouibi
24

NÃO ESQUEÇA DE ADICIONAR ksoap2.jar no seu projeto e também adicione a permissão INTERNET no arquivo 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
fonte
HttpTransportSE onde posso obter essa classe?
Noman
Olá, estou usando seu código, mas estou recebendo o seguinte erro, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = É necessária a autenticação do comerciante .; }; }; }; } Você pode me ajudar por favor?
21813 Hasmukh
oi Amit im também Amit ..... u pode me dizer como resposta compararmos quando chegamos resposta é bem sucedida ou não, então como e quais as condições de verificar a resposta ......
Amitsharma
como adicionar array em xml da propriedade request?
Droidster.me 9/12/16
21

Eu tive meu encontro com o KSOAP; Eu escolhi uma abordagem bastante mais simples.

Dado um arquivo WSDL, crie modelos de Solicitação SOAP para cada Solicitação (por exemplo: usando SOAP UI) e substitua os valores a serem passados ​​no código. POSTAR esses dados para o terminal de serviço usando a instância DefaultHttpClient e obter o fluxo de resposta. Analise o fluxo de resposta usando um analisador XML Pull.

Samuh
fonte
18

Você pode dar uma olhada no WSClient ++

Akash Kava
fonte
4
Finalmente um primeiro resposta útil após a repetição quer kSoap ou SAX
rustyx
Eu tentei a versão demo. Não funcionou para mim por um serviço simples. Não vale a pena gastar tantos $$$$$.
Tushar 26/07
16

Eu criei um novo cliente SOAP para a plataforma Android. Ele está usando uma interface gerada por JAX-WS, mas é apenas uma prova de conceito até agora.

Se você estiver interessado, tente o exemplo e / ou assista à fonte no AndroidSOAP .

Gábor AUTH
fonte
1
Tive o prazer de assistir à sua apresentação no JUM XVII. Budapeste sobre esse material Android. Mantenha o bom trabalho!
pcjuzer
15

Se você puder, vá para JSON. O Android vem com o pacote org.json completo

Yves
fonte
14

Chame os métodos ksoap2 . Funciona muito bem.

Configure os detalhes, como

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

e depois para obter o resultado faça

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

Alguns meses atrás, eu estava trabalhando com o serviço da web jax-ws no aplicativo j2ee. Lá estávamos usando o CXF wsdl2java para gerar o stub do cliente WS a partir do arquivo WSDL e com esses stubs do cliente consumimos os serviços da web. Algumas semanas atrás, quando eu estava tentando consumir o serviço da Web da mesma maneira na plataforma Android, não pude, porque o jar Android não possui todas as classes de suporte "jax-ws" nele. Naquela época, não encontrei nenhuma ferramenta desse tipo (se não consegui pesquisar no Google com eficiência) para atender aos meus requisitos -

  • Obtenha o stub do cliente no WSDL.
  • E chame o serviço com algum argumento (objeto de solicitação de negócios java).
  • Obtenha o Objeto de Negócios de Resposta.

Então, desenvolvi minha própria ferramenta de geração de cliente SOAP para Android . Onde você deve seguir estas etapas:

  • No WSDL Obtenha o WS Client Stub, coloque-o no seu projeto.
  • Diga para algum serviço "ComplexOperationService", instancie o serviço, obtenha a porta Endpoint e chame o método de serviço e obtenha a resposta do serviço da Web:

por exemplo:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Você não precisa se preocupar com a classe de serviço / req / response ou com outras classes e com o método, pois sabe que tudo isso é gerado a partir do WSDL.
  • E é claro que você não precisa estar ciente da ação do sabão / envelope / namespace etc. Basta chamar o método como nós, desenvolvedores, fazemos o tempo todo.
Asraful Haque
fonte
Você sabe como lidar com o Date? O Apache CXF o traduz para XMLGregorianCalendar, que não consigo criar no Android.
Martin Nuc
9

Tenho certeza de que você poderia fazer um pequeno cliente SOAP com o Axis . Instruções de instalação do eixo .

branchgabriel
fonte
2
Isso funcionaria apenas se o eixo fosse compatível com o Android. Não é (algo sobre pacotes javax. * Nas dependências do eixo).
PaulProgrammer
6

Siga estas etapas pelo método SOAP

No arquivo WSDL,

  • crie modelos de solicitação SOAP para cada solicitação.

  • Em seguida, substitua os valores a serem passados ​​no código.

  • POSTE esses dados para o terminal em serviço usando a instância DefaultHttpClient.

  • Obtenha o fluxo de resposta e, finalmente,

  • Analise o fluxo de resposta usando um analisador XML Pull.

Manick
fonte
6

Para mim, a maneira mais fácil é usar uma boa ferramenta para gerar todas as classes necessárias. Pessoalmente, eu uso este site:

http://easywsdl.com/

Ele suporta serviços da Web bastante complexos e usa o ksoap2.

robocik
fonte
5

Eu sugeriria verificar uma ferramenta muito útil que me ajudou muito. Os caras que cuidam desse projeto também foram muito úteis. www.wsdl2code.com/

miroslavign
fonte
5

Se estiver com problemas para ligar para o Serviço Web no android, use o código abaixo para ligar para o serviço Web e obter resposta. Verifique se o serviço da Web retorna a resposta no formato de tabela de dados. Esse código o ajudará se você estiver usando dados do banco de dados do SQL Server . Se você estiver usando o MYSQL, precisará alterar uma coisa, substitua a palavra NewDataSet da frase obj2=(SoapObject) obj1.getProperty("NewDataSet");por 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
        }
    }

Se você tiver algum problema com relação a isso, pode me escrever ..

Sachin D
fonte
4

Faça o download e adicione o arquivo da biblioteca SOAP ao seu projeto Nome do arquivo: ksoap2-android-assembly-3.4.0-jar-with-dependencies

Limpe o aplicativo e inicie o programa

Aqui está o código para a chamada de serviço 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";
    }

Os resultados podem ser JSONObject ou JSONArray Or String

Para sua melhor referência, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Obrigado.

lokesh s
fonte
3

Este é um exemplo prático de consumo de serviços web SOAP no Android.

** Nota :: *** NÃO ESQUEÇA DE ADICIONAR ksoap2.jar no seu projeto e também adicione a permissão INTERNET no arquivo 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();
    }
}
Uma corrida
fonte
por favor me ajude nesta questão stackoverflow.com/questions/41573829/...
Edijae Crusar
3

Você pode executar chamadas de sabão como postagem por http com determinados cabeçalhos. Resolvi esta questão sem bibliotecas adicionais como o ksoap2 Aqui está o código ao vivo recebendo pedidos do serviço de sabão

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
fonte
ajude aqui stackoverflow.com/questions/41573829/…
Edijae Crusar
duas perguntas sobre isso: 1. Como isso é chamado a partir da atividade principal? 2. Qual deve ser o valor de StringUrlShipment que é passado como parâmetro?
Tori
no comentário acima, ignore a pergunta nº 1.
Tori
Da atividade principal, você deve usar o AsyncTask para chamar esse código. Dentro desta classe AsyncTask implementar doInBackground para lançar este código
Lapenkov Vladimir
2

Para chamar um serviço da web SOAP do android, tente usar este cliente

NÃO ESQUEÇA DE ADICIONAR ksoap2-android.jar no seu caminho de compilação 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
fonte
@ Wajdi hh como comparar res de resposta do resultado da resposta do doador: - success ..... "respondce = 1 ~ Successfull" .... então como comparamos esse resultado da condição que é do lado do servidor ...... ..
Amitsharma
1

Adicione Sabar Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar):

String estática pública 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
fonte