【问题标题】:Get data with parameter using Retrofit in Android在 Android 中使用 Retrofit 获取带参数的数据
【发布时间】:2017-05-12 11:16:21
【问题描述】:

我正在尝试使用 Laravel REST API 和 Retrovit 从数据库中获取数据。我正在使用一个参数来获取我想要的数据,但它一直返回onFailure,我不知道为什么。这是我的代码:

API 接口

@GET("getDetilFilm/{idFilm}/getDetilFilm")
Call<Film> getDetilFilm(@Query("idFilm") String idFilm);

活动:

public class DetilFilmActivity extends AppCompatActivity {

    ApiInterface mApiInterface;

    @InjectView(R.id.tvJudulFilm)
    TextView judulFilm;
    @InjectView(R.id.tvDurasi)
    TextView durasi;
    @InjectView(R.id.tvGenre)
    TextView genre;
    @InjectView(R.id.tvSinopsis)
    TextView sinopsis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detil_film);
        ButterKnife.inject(this);
        getDetilFilmById();
    }

    private void getDetilFilmById(){

        mApiInterface = ApiClient.getClient().create(ApiInterface.class);

        Call<Film> callDetilFilm= mApiInterface.getDetilFilm("6");
        callDetilFilm.enqueue(new Callback<Film>() {
            @Override
            public void onResponse(Call<Film> call, Response<Film> response) {
                Film detil =response.body();
                genre.setText(detil.getIdGenre());
                judulFilm.setText(detil.getJudulFilm());
                sinopsis.setText(detil.getKeterangan());
                durasi.setText(detil.getDurasi());
            }

            @Override
            public void onFailure(Call<Film> call, Throwable t) {
                Toast.makeText(DetilFilmActivity.this, "Failed to load", Toast.LENGTH_LONG).show();
            }
        });
    }
}

电影课

    public class Film {

    @SerializedName("judulFilm")
    private String judulFilm;
    @SerializedName("durasi")
    private String durasi;
    @SerializedName("keterangan")
    private String keterangan;
    @SerializedName("idGenre")
    private String idGenre;
    @SerializedName("idFilm")
    private String idFilm;
    private String foto;
    private String flag;
    private String created_at;
    private String updated_at;
    @SerializedName("backdrop_path")
    private String backdropPath;

    public Film(String judulFilm, String durasi, String keterangan, String idGenre, String idFilm, String foto, String flag, String created_at, String updated_at) {
        this.judulFilm = judulFilm;
        this.durasi = durasi;
        this.keterangan = keterangan;
        this.idGenre = idGenre;
        this.idFilm = idFilm;
        this.foto = foto;
        this.flag = flag;
        this.created_at = created_at;
        this.updated_at = updated_at;
    }

    public String getJudulFilm() {
        return judulFilm;
    }

    public void setJudulFilm(String judulFilm) {
        this.judulFilm = judulFilm;
    }

    public String getDurasi() {
        return durasi;
    }

    public void setDurasi(String durasi) {
        this.durasi = durasi;
    }

    public String getKeterangan() {
        return keterangan;
    }

    public void setKeterangan(String keterangan) {
        this.keterangan = keterangan;
    }

    public String getIdGenre() {
        return idGenre;
    }

    public void setIdGenre(String idGenre) {
        this.idGenre = idGenre;
    }

    public String getIdFilm() {
        return idFilm;
    }

    public void setIdFilm(String idFilm) {
        this.idFilm = idFilm;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public String getBackdropPath() {
        return backdropPath;
    }

    public void setBackdropPath(String backdropPath) {
        this.backdropPath = backdropPath;
    }
}

编辑

我把 onResponse 改成这个

@Override
        public void onResponse(Call<List<Film>> call, Response<List<Film>> response) {
            List<Film> detil =response.body();
            try
            {
                for(int i=0;i<=detil.size();i++)
                {
                        genre.setText(detil.get(i).getIdGenre());
                        judulFilm.setText(detil.get(i).getJudulFilm());
                        sinopsis.setText(detil.get(i).getKeterangan());
                        durasi.setText(detil.get(i).getDurasi());

                }
            }
            catch(Exception e)
            {
                Log.e("onFailure: ", e.getMessage(), e);
                Log.d("onFail", call.request().url().toString());
            }
        }

错误变为

 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

有人可以帮忙吗?提前致谢

【问题讨论】:

  • 记录错误信息以了解“为什么”,例如 Log.e("onFailure: ", t.getmessage(), t);
  • 你能把你的最终网址贴在这里吗?
  • 使用Log.d("onFail", call.request().url().toString()); 确保您在正确的网址上请求。
  • @AnandSingh 错误日志返回 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $
  • @SekarAnindya 这意味着你的 pojo 类有问题Film

标签: android get retrofit


【解决方案1】:

换行——

@GET("getDetilFilm/{idFilm}/getDetilFilm")
Call<Film> getDetilFilm(@Query("idFilm") String idFilm);

@GET("getDetilFilm/{idFilm}/getDetilFilm")
Call<Film> getDetilFilm(@Path("idFilm") String idFilm);

因为根据您的查询,idFilm 应该是 @Path 而不是 @Query

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 2016-08-05
    • 1970-01-01
    • 2022-01-23
    • 2019-08-17
    • 2016-07-29
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多