Making web service calls separately

Asked

Viewed 271 times

1

I need to finish an application I’m doing on Android, in the login step I’m doing, and for that, I have two webservices to perform it, one is the Identifier and the second is the Loginsamba.

I’d like to make it clear that:

  • It will only proceed to the Loginsamba, if the Identifier be correct
  • The Loginsamba should be obligatorily performed only after the validation of Identifier
  • If fail, will charge the error (that this is not happening.. :/)

The complete code of how he is, is here:

package com.testes.infovendas;

//Imports
import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;

//KSOAP2 -- Lib de conexão Webservice SOAP
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;

//Adicionais
import com.testes.infovendas.R;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class InfoVendas extends ActionBarActivity {

//Variáveis
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://www.dominio.com.br/servicos/ws.asmx";
private final String SOAP_ACTION = "http://tempuri.org/ObterIdentificadorLoja";
private static final String SOAP_ACTION2 = "http://tempuri.org/LoginSamba";    
private final String METHOD_NAME = "ObterIdentificadorLoja";
private final String METHOD_NAME = "LoginSamba";
private String TAG = "ASSYNC";
private static String cnpj_cpf_codclie, codloja, seguranca, identificadorloja;
Button b;
TextView tv;
EditText et1,et2,et3,et4;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//Identificando cada campo e função
et1 = (EditText) findViewById(R.id.editCodloja);
et2 = (EditText) findViewById(R.id.editCPF);
et3 = (EditText) findViewById(R.id.editUser);
et4 = (EditText) findViewById(R.id.editPass);
tv = (TextView) findViewById(R.id.login_informa);
b = (Button) findViewById(R.id.btnEnviar);
//Listener para quando clicar no botão Enviar
b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        //Se todos os campos forem preenchidos, será retomado o login
        if (et1.getText().length() != 0 && et1.getText().toString() != "" || 
                et2.getText().length() != 0 && et2.getText().toString() != "" || 
                et3.getText().length() != 0 && et3.getText().toString() != "" || 
                et4.getText().length() != 0 && et4.getText().toString() != "") {

            //Pega todas as informações escritas nos campos e adiciona em suas respectivas variáveis para uso do WS
            codloja = et1.getText().toString();
            cnpj_cpf_codclie = et2.getText().toString();
            seguranca = "chavesecreta";

            AsyncCallWS task = new AsyncCallWS();
            task.execute();

        } 
        //Se não for preenchido todos os campos, será retornado um TextView apenas informado para informar corretamente
        else {
            tv.setText("Por favor, insira todos os dados.");
        }
    }
});
}

// Classe AsyncIdentificador
private class AsyncIdentificador extends AsyncTask<String, Void, Void> {

    // Retorna como null o valor do Identificador


    // Mensagem ao clicar no botão Enviar
            @Override
            protected void onPreExecute() {
                Log.i(TAG, "onPreExecute");
                tv.setText("Estabelecendo conexão ao servidor...");
                tv.setText("Estabelecendo conexão ao servidor..");
                tv.setText("Estabelecendo conexão ao servidor...");
            }
    @Override
    protected Void doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        getIdentificador(cnpj_cpf_codclie, codloja, seguranca);
        return null;
    }

    // Mensagem e ação pós conclusão
    @Override
    protected void onPostExecute(Void result) {
        Log.i(TAG, "onPostExecute");
        tv.setText("Conexão estabelecida com sucesso. \nRealizando o login...");
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i(TAG, "onProgressUpdate");
    }

}

// Classe AsyncLogin
private class AsyncLogin extends AsyncTask<String, Void, Void> {

    // Retorna como null o valor do Identificador
    @Override
    protected Void doInBackground(String... params) {
        Log.i(TAG2, "doInBackground");
        logarSambaNet(identificadorloja, nome, senha, seguranca);
        return null;
    }

    // Mensagem e ação pós conclusão
    @Override
    protected void onPostExecute(Void result) {
        Log.i(TAG2, "onPostExecute");
        tv.setText("Login efetuado com sucesso");

    }

    // Mensagem ao clicar no botão Enviar
    @Override
    protected void onPreExecute() {
        Log.i(TAG2, "onPreExecute");
        tv.setText("Autenticando dados..");
        tv.setText("Autenticando dados...");
        tv.setText("Autenticando dados....");
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i(TAG2, "onProgressUpdate");
    }

}

// Classe para obter os dados do Identificador

public void getIdentificador(String cnpj_cpf_codclie, String codloja,
        String seguranca) {

    // Cria o request

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    piCodLoja = new PropertyInfo();
    piCodLoja.setName("codloja");
    piCodLoja.setValue(et1.getText().toString());
    piCodLoja.setType(String.class);
    request.addProperty(piCodLoja);

    piCPF = new PropertyInfo();
    piCPF.setName("cnpj_cpf_codclie");
    piCPF.setValue(et2.getText().toString());
    piCPF.setType(String.class);
    request.addProperty(piCPF);

    piSecret = new PropertyInfo();
    piSecret.setName("seguranca");
    piSecret.setValue("Secret");
    piSecret.setType(String.class);
    request.addProperty(piSecret);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;

    // Seta a saída do objeto SOAP

    envelope.setOutputSoapObject(request);

    // Cria a chamada do objeto HTTP

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {

        // Invoca o Web Service

        androidHttpTransport.call(SOAP_ACTION, envelope);

        // Get the response

        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

        // Define identificadorloja como uma variável estática

        identificadorloja = response.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

// Classe para logar no samba.Net

public void logarSambaNet(String identificadorloja, String nome,
        String senha, String seguranca) {

    // Cria o request

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);

    piNome = new PropertyInfo();
    piNome.setName("nome");
    piNome.setValue(et3.getText().toString());
    piNome.setType(String.class);
    request.addProperty(piNome);

    piSenha = new PropertyInfo();
    piSenha.setName("senha");
    piSenha.setValue(et4.getText().toString());
    piSenha.setType(String.class);
    request.addProperty(piSenha);

    piIdentificador = new PropertyInfo();
    piIdentificador.setName("identificadorloja");
    piIdentificador.setValue(identificadorloja.toString());
    piIdentificador.setType(String.class);
    request.addProperty(piIdentificador);

    piSecret = new PropertyInfo();
    piSecret.setName("seguranca");
    piSecret.setValue("Secret");
    piSecret.setType(String.class);
    request.addProperty(piSecret);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;

    // Seta a saída do objeto SOAP

    envelope.setOutputSoapObject(request);

    // Cria a chamada do objeto HTTP

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {

        // Invoca o Web Service

        androidHttpTransport.call(SOAP_ACTION2, envelope);

        // Get the response

        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

        // Define identificadorloja como uma variável estática

        LoginSamba = response.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

If possible, give me suggestions as well, I’m starting.. Thank you very much!

  • Renan, why don’t you put the two together AsyncTask (login and identifier) in one? You are already running everything in a separate Thread. So it is easier to control the flow sequentially.

  • how could I accomplish this?

  • Enter the code of the two AsyncTask's in one, so the call is sequential, making it easier to control the flow.

  • How I do this procedure @Wakim?

1 answer

1


I ended up answering my question myself.. I just don’t know if it’s correct yet, if one is only running after the other.. Can anyone comment by checking my code? Thank you!

// Classe AsyncIdentificador
private class AsyncIdentificador extends AsyncTask<String, Void, Void> {

    // Retorna como null o valor do Identificador

    // Mensagem ao clicar no botão Enviar
    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
        tv.setText("Estabelecendo conexão ao servidor...");
    }

    @Override
    protected Void doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        getIdentificador(cnpj_cpf_codclie, codloja, seguranca);
        logarSambaNet(identificadorloja, nome, senha, seguranca);
        return null;
    }

    // Mensagem e ação pós conclusão
    @Override
    protected void onPostExecute(Void result) {
        Log.i(TAG, "onPostExecute");
        if (identificadorloja.toString() != "null"
                && identificadorloja.toString() != "NULL") {
            if (Integer.parseInt(LoginSamba) != 0) {
                tv.setText("Conexão estabelecida com sucesso. \nBem Vindo!");
            } else {
                tv.setText("Dados incorretos.\nPor favor, verifique os dados informados.");
            }
        } else {
            tv.setText("Dados incorretos.\nPor favor, verifique os dados informados.");

        }
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i(TAG, "onProgressUpdate");
        tv.setText("Estabelecendo conexão ao servidor...");

    }

}
  • Renan, I’m sorry I didn’t answer, but I’m pretty tied up and I wouldn’t have time (I needed to contextualize myself before, and have a way to test). But that’s exactly what I was talking about, calling both ways inside the same AsyncTask, I believe your code is correct yes. I only recommend using the return of doInBackground to give information to onPostExecute instead of storing as instance variable the result, but this is just an adjustment of "aesthetics".

  • Thank you very much Wakim, your help was great! And no problem at all have not answered! hahaha

  • But how so utilize the return @Wakim? I’m newba too!! xD

Browser other questions tagged

You are not signed in. Login or sign up in order to post.