【问题标题】:Making a Json Request and Response in Android在 Android 中发出 Json 请求和响应
【发布时间】:2016-11-01 20:53:01
【问题描述】:

我正在尝试在 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();
        }
    });

}

查看我正在尝试请求和响应的 Web 服务的 Json:

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

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

如何发送凭证:“Email”“Senha”并接收 Json 响应?

怎么了?

谢谢各位!

【问题讨论】:

  • 你能说得更具体点吗?你已经创建了代码,现在你想知道如何让它工作吗?您想了解如何使用 Gson 或 FasterXML/Jackson 的示例?
  • 到目前为止你尝试过什么?您可以发布您创建的未按预期工作的代码示例吗?这个关于如何在 StackOverflow 上提问的链接可能会有所帮助stackoverflow.com/help/how-to-ask
  • 谢谢大家的回复,所以..我写了一些代码..但我无法收到Json响应..我将代码粘贴在这里..
  • 您刚刚发布的内容不是答案。你可以edit你的帖子

标签: java android json rest


【解决方案1】:
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();
 } 

【讨论】:

  • 不确定我在看什么。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多