【问题标题】:Retrofit URL query string must not have replace block改造 URL 查询字符串不能有替换块
【发布时间】:2018-07-25 14:13:43
【问题描述】:

我已经创建了一个使用 Retrofit2 删除 MySQL 数据库中某些数据的方法,但它总是抛出这样的错误:

java.lang.IllegalArgumentException: URL query string "apicall=deleteBooking&={id}" must not have replace block. For dynamic query parameters use @Query. for method UserService.deleteBooking

这是我的 deleteBooking 方法:

public void deleteBooking(int id){
        Call<BookingInfo> call = userService.deleteBooking(id);
        call.enqueue(new Callback<BookingInfo>() {
            @Override
            public void onResponse(Call<BookingInfo> call, Response<BookingInfo> response) {
                if(response.isSuccessful()){
                    Log.i("DELETE RESPONSE: ", response.body().toString());
                    finish();
                }
            }

            @Override
            public void onFailure(Call<BookingInfo> call, Throwable t) {
                    Log.e("DELETE ERROR: ", t.getMessage());
            }
        });
    }

这是我的 UserService 接口:

public interface UserService {

    @GET("api.php?apicall=getBookings")
    Call<GetBookingInfo> getBookings();

    @FormUrlEncoded
    @POST("api.php?apicall=createBooking")
    Call<BookingInfo> addBooking(@FieldMap HashMap<String, String> booking);

    @PUT("api.php?apicall=updateStatus")
    Call<BookingInfo> updateStatus(@Path("status") String status, @Body BookingInfo booking);

    @DELETE("api.php?apicall=deleteBooking&={id}")
    Call<BookingInfo> deleteBooking(@Query("id") int id);

}

我已将调用 deleteBooking 更改为@Query(我搜索了几个问题,答案总是必须更改为@Query,在此之前我使用@Path),但它仍然抛出错误。我不知道这个问题的解决方案。如果您想了解更多信息,请随时询问,我会给您所需的代码等。谢谢!

【问题讨论】:

  • 删除这个 &={id}
  • 从@DELETE 注释中移除 '&={id}'

标签: android retrofit


【解决方案1】:

改成下面这样:

@DELETE("api.php")
Call<BookingInfo> deleteBooking(@Query("id") int id,
                                @Query("apicall") String action);

并像下面这样调用它:

Call<BookingInfo> call = userService.deleteBooking(id, "deleteBooking");

编辑: 如果您不想将操作移出,请尝试以下操作:

     @DELETE("api.php?apicall=deleteBooking")
     Call<BookingInfo> deleteBooking(@Query("id") int id);

【讨论】:

  • 我没有看到将动作抽象出来的好处。删除操作将始终具有 deleteBooking 操作。
  • 您需要这样做,因为您将它作为查询参数传递。如果您还控制后端,则可以将 api 端点修改为:“api.php?id=1”,如果它总是要被删除
  • 我是说 url 中的硬编码 deleteBooking 很好 @DELETE("api.php?apicall=deleteBooking")
猜你喜欢
  • 2019-01-30
  • 2014-08-27
  • 2017-12-12
  • 2018-02-04
  • 2020-01-22
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多