在Android中制作Json请求和响应

时间:2016-11-01 20:53:01

标签: java android json rest

我正在尝试在Android中制作Json请求和响应,但我是新手,我需要如何制作此示例..

建立连接:

public class ServiceGeneratorCpf {

//URL base do endpoint. Deve sempre terminar com /
public static final String API_BASE_URL = "http://www.soawebservices.com.br/";

public static <S> S createService(Class<S> serviceClass) {

    //Instancia do interceptador das requisições
    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
            .readTimeout(15, TimeUnit.SECONDS);

    httpClient.addInterceptor(loggingInterceptor);


    //Instância do retrofit
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(new Gson()))
            .client(httpClient.build())
            .build();

    return retrofit.create(serviceClass);
}

型号:

public class RespostaServidorCpf {

private String result;
private Boolean valid;
private String Email;
private String Senha;
private String Documento;
private String Nome;
private String DataNascimento;
private String DataInscricao;
private String AnoObito;
private String MensagemObito;
private String CodigoSituacaoCadastral;
private String SituacaoRFB;
private Date DataConsultaRFB;
private String ProtocoloRFB;
private String DigitoVerificador;
private String Mensagem;
private Boolean Status;

public RespostaServidorCpf(){

}

public String getResult() {
    return result;
}

public boolean isValid() {
    return valid;
}

public void setValid(boolean valid) {
    this.valid = valid;
}

public void setResult(String result) {
    this.result = result;
}

public String getDocumento() {
    return Documento;
}

public void setDocumento(String Documento) {
    this.Documento = Documento;
}


public String getNome() {
    return Nome;
}

public void setNome(String nome) {
    Nome = nome;
}

public String getDataNascimento() {
    return DataNascimento;
}

public void setDataNascimento(String dataNascimento) {
    DataNascimento = dataNascimento;
}

public String getDataInscricao() {
    return DataInscricao;
}

public void setDataInscricao(String dataInscricao) {
    DataInscricao = dataInscricao;
}

public String getAnoObito() {
    return AnoObito;
}

public void setAnoObito(String anoObito) {
    AnoObito = anoObito;
}

public String getMensagemObito() {
    return MensagemObito;
}

public void setMensagemObito(String mensagemObito) {
    MensagemObito = mensagemObito;
}

public String getCodigoSituacaoCadastral() {
    return CodigoSituacaoCadastral;
}

public void setCodigoSituacaoCadastral(String codigoSituacaoCadastral) {
    CodigoSituacaoCadastral = codigoSituacaoCadastral;
}

public String getSituacaoRFB() {
    return SituacaoRFB;
}

public void setSituacaoRFB(String situacaoRFB) {
    SituacaoRFB = situacaoRFB;
}

public Date getDataConsultaRFB() {
    return DataConsultaRFB;
}

public void setDataConsultaRFB(Date dataConsultaRFB) {
    DataConsultaRFB = dataConsultaRFB;
}

public String getProtocoloRFB() {
    return ProtocoloRFB;
}

public void setProtocoloRFB(String protocoloRFB) {
    ProtocoloRFB = protocoloRFB;
}

public String getDigitoVerificador() {
    return DigitoVerificador;
}

public void setDigitoVerificador(String digitoVerificador) {
    DigitoVerificador = digitoVerificador;
}

public String getMensagem() {
    return Mensagem;
}

public void setMensagem(String mensagem) {
    Mensagem = mensagem;
}

public Boolean getStatus() {
    return Status;
}

public void setStatus(Boolean status) {
    Status = status;
}

public String getEmail() {
    return Email;
}

public void setEmail(String email) {
    Email = email;
}

public String getSenha() {
    return Senha;
}

public void setSenha(String senha) {
    Senha = senha;
}

界面:

public interface RetrofitService {

@Headers({
        "Content-Type: application/json"
})

@FormUrlEncoded
@POST("restservices/producao/cdc/pessoafisicanfe.ashx")
Call<RespostaServidorCpf> mostrarConsultaCpf(@Field("Email") String Email,
                                             @Field("Senha") String Senha,
                                             @Field("Documento") String Documento,
                                             @Field("DataNascimento") String DataNascimento);

}

我收到Json回复的地方:

public class ResultConsCpfActivity extends AppCompatActivity {

RespostaServidorCpf resposta = new RespostaServidorCpf();
private ProgressDialog progress;
private String Senha;
private String Email;
private TextView txtDocumento;
private TextView txtNome;
private TextView txtDataNascimento;
private TextView txtDataInscricao;
private TextView txtAnoObito;
private TextView txtMensagemObito;
private TextView txtCodigoSituacaoCadastral;
private TextView txtSituacaoRFB;
private TextView txtDataConsultaRFB;
private TextView txtProtocoloRFB;
private TextView txtDigitoVerificador;
private TextView txtMensagem;
private TextView txtStatus;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result_cons_cpf);

    Email = "pedrofarbo@gmail.com";
    Senha = "efTE8zjwC";

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String date = bundle.getString("date");
    String cpf = bundle.getString("cpf");

    txtDocumento = (TextView) findViewById(R.id.txtDocumento);
    txtNome = (TextView) findViewById(R.id.txtNome);
    txtDataNascimento = (TextView) findViewById(R.id.txtDataNascimento);
    txtDataInscricao = (TextView) findViewById(R.id.txtDataInscricao);
    txtAnoObito = (TextView) findViewById(R.id.txtAnoObito);
    txtMensagemObito = (TextView) findViewById(R.id.txtMensagemObito);
    txtCodigoSituacaoCadastral = (TextView) findViewById(R.id.txtCodigoSituacaoCadastral);
    txtSituacaoRFB = (TextView) findViewById(R.id.txtSituacaoRFB);
    txtDataConsultaRFB = (TextView) findViewById(R.id.txtDataConsultaRFB);
    txtProtocoloRFB = (TextView) findViewById(R.id.txtProtocoloRFB);
    txtDigitoVerificador = (TextView) findViewById(R.id.txtDigitoVerificador);
    txtMensagem = (TextView) findViewById(R.id.txtMensagem);
    txtStatus = (TextView) findViewById(R.id.txtStatus);

    progress = new ProgressDialog(ResultConsCpfActivity.this);
    progress.setTitle("Recebendo Consulta...");
    progress.show();

    //pega os valores dos edittextos
    String email = Email;
    String senha = Senha;

    //chama o retrofit para fazer a requisição no webservice
    retrofitConverter(email, senha, cpf, date);

}

public void setaValores(){

    txtDocumento.setText(resposta.getDocumento());
    txtNome.setText(resposta.getNome());
    txtDataNascimento.setText(resposta.getDataNascimento());
    txtDataInscricao.setText(resposta.getDataInscricao());
    txtAnoObito.setText(resposta.getAnoObito());
    txtMensagemObito.setText(resposta.getMensagemObito());
    txtCodigoSituacaoCadastral.setText(resposta.getCodigoSituacaoCadastral());
    txtSituacaoRFB.setText(resposta.getSituacaoRFB());
    txtDataConsultaRFB.setText((CharSequence) resposta.getDataConsultaRFB());
    txtProtocoloRFB.setText(resposta.getProtocoloRFB());
    txtDigitoVerificador.setText(resposta.getDigitoVerificador());
    txtMensagem.setText(resposta.getMensagem());


}


public void retrofitConverter(String Email, String Senha, String Documento, String DataNascimento) {

    RetrofitService service = ServiceGeneratorCpf.createService(RetrofitService.class);

    Call<RespostaServidorCpf> call = service.mostrarConsultaCpf(Email, Senha, Documento, DataNascimento);

    call.enqueue(new Callback<RespostaServidorCpf>() {
        @Override
        public void onResponse(Call<RespostaServidorCpf> call, Response<RespostaServidorCpf> response) {

            if (response.isSuccessful()) {

                RespostaServidorCpf respostaServidorCpf = response.body();

                //verifica aqui se o corpo da resposta não é nulo
                if (respostaServidorCpf != null) {

                    if(respostaServidorCpf.isValid()) {

                        resposta.setDocumento(respostaServidorCpf.getDocumento());
                        resposta.setNome(respostaServidorCpf.getNome());
                        resposta.setDataNascimento(respostaServidorCpf.getDataNascimento());
                        resposta.setDataInscricao(respostaServidorCpf.getDataInscricao());
                        resposta.setAnoObito(respostaServidorCpf.getAnoObito());
                        resposta.setMensagemObito(respostaServidorCpf.getMensagemObito());
                        resposta.setCodigoSituacaoCadastral(respostaServidorCpf.getCodigoSituacaoCadastral());
                        resposta.setSituacaoRFB(respostaServidorCpf.getSituacaoRFB());
                        resposta.setDataConsultaRFB(respostaServidorCpf.getDataConsultaRFB());
                        resposta.setProtocoloRFB(respostaServidorCpf.getProtocoloRFB());
                        resposta.setDigitoVerificador(respostaServidorCpf.getDigitoVerificador());
                        resposta.setMensagem(respostaServidorCpf.getMensagem());
                        resposta.setValid(respostaServidorCpf.isValid());

                        progress.dismiss();
                        setaValores();

                    } else{

                        Toast.makeText(getApplicationContext(),"Insira unidade e valores válidos", Toast.LENGTH_SHORT).show();
                    }

                } else {

                    Toast.makeText(getApplicationContext(),"Resposta nula do servidor", Toast.LENGTH_SHORT).show();
                }

            } else {

                Toast.makeText(getApplicationContext(),"Resposta não foi sucesso", Toast.LENGTH_SHORT).show();
                // segura os erros de requisição
                ResponseBody errorBody = response.errorBody();
            }

            progress.dismiss();
        }

        @Override
        public void onFailure(Call<RespostaServidorCpf> call, Throwable t) {

            Toast.makeText(getApplicationContext(),"Erro na chamada ao servidor", Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(intent);

            progress.dismiss();
        }
    });

}

查看我正在尝试请求和回复的网络服务的Json:

Json url:http://soawebservices.com.br/restservices/producao/cdc/pessoafisicanfe.ashx

请在回答问题之前查看链接!

如何发送凭据:“电子邮件”“Senha”并收到Json回复?

有什么问题?

谢谢大家!

1 个答案:

答案 0 :(得分:0)

Host: soawebservices.com.br
POST /restservices/producao/cdc/pessoafisicanfe.ashx
Content-Type: application/json

{
  "Credenciais": {
    "Email": "Seu endereco de E-Mail",
    "Senha": "Sua Senha"
  },
  "Documento": "999.999.999-99",
  "DataNascimento": "01/11/2016"
}

所以需要注意的事项:

  • 改进基本URI - API_BASE_URL = "http://www.soawebservices.com.br/";(您可以在其末尾添加restservices ...)
  • 方法类型 - @POST
  • 要发送到的地址 - "restservices/producao/cdc/pessoafisicanfe.ashx"
  • 内容类型 - application/json。你在@Headers中设置了这个,所以这很好。

现在,邮件正文......

1)它不是FormUrlEncoded。至少我不认为这是JSON请求的工作方式 2)Credenciais是一个对象本身,请求的主体没有EmailSenhaDocumentoDataNascimento的单独列表。

因此,您需要实现Credenciais类。

public class Credencials {
    private String Email, Senha;

    public Credencials(String email, String senha) {
        this.Email = email;
        this.Senha = senha;
    }

    // getters, setters...
}

并在界面中使用

Call<RespostaServidorCpf> mostrarConsultaCpf(
           @Field("Credencials") Credencials credencials,
           @Field("Documento") String Documento,
           @Field("DataNascimento") String DataNascimento);

另外,使用该课程

RetrofitService service = ServiceGeneratorCpf.createService(RetrofitService.class);

Credencials cred = new Credencials(Email, Senha);

Call<RespostaServidorCpf> call = service.mostrarConsultaCpf(cred, Documento, DataNascimento);

最后,崩溃if语句。

 //verifica aqui se o corpo da resposta não é nulo
 if (respostaServidorCpf != null && respostaServidorCpf.isValid()) {
     resposta = respostaServidorCpf;

     progress.dismiss();
     setaValores();
 }