使用正文删除仍然无法使用Retrofit

时间:2015-07-03 13:03:42

标签: java android android-studio retrofit

我尽我所能,但它仍然无效。我已经使用okhttp 2.0和okhttp-urlconnection 2.0结合改进1.9。删除正文仍然无法正常工作,我已经检查过此问题之前发布的所有问题,但我仍然找不到答案。有什么我做错了吗?

这就是我的界面:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@RestMethod(value = "DELETE", hasBody = true)
@interface MY_DELETE {
    String value();
}

public interface WebServiceMethods {

@FormUrlEncoded
@Headers("Content-Type: application/json")
@MY_DELETE("/DeleteLoggedHours")
void deleteLoggedHour(@Body ProjectTask projectTask, Callback<SuccessSubmissionChecker> successSubmissionCheckerCallback);}

对于我的WebSevice,它看起来像这样:

public class WebService {

final private static String BASE_URL = "http://172.17.24.26:758/Service1.svc";

public static WebServiceMethods webServiceMethods;

private OkHttpClient getClient() {
    OkHttpClient client = new OkHttpClient();
    client.setConnectTimeout(5, TimeUnit.MINUTES);
    client.setReadTimeout(5, TimeUnit.MINUTES);
    return client;
}

public static WebServiceMethods getWebServiceMethods() {

    final OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(2, TimeUnit.MINUTES);
    okHttpClient.setConnectTimeout(2, TimeUnit.MINUTES);

    if (webServiceMethods == null){
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(BASE_URL)
                .setClient(new OkClient(okHttpClient))
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setLog(new RestAdapter.Log() {
                    @Override
                    public void log(String msg) {
                      Log.e("RestAdapter", msg);
                    }
                })
                .build();

        webServiceMethods = restAdapter.create(TimeTrackerWebServiceMethods.class);
    }

    return webServiceMethods;
}

这是我称之为方法的地方:

public void deleteLoggedHour(ProjectTask projectTask, final MainFragment.DeleteCheckerCallback deleteCallback) {

     WebServiceMethods.deleteLoggedHour(projectTask, new Callback<SuccessSubmissionChecker>() {
         @Override
         public void success(SuccessSubmissionChecker submissionChecker, Response response) {
             Log.e(LOG_TAG, "deleteLoggedHour success");
             Log.e(LOG_TAG, " successSubmissionChecker : " + submissionChecker.isSuccessful());
             deleteCallback.onDeleteSuccess();
         }

         @Override
         public void failure(RetrofitError error) {
             Log.e(LOG_TAG, "deleteLoggedHour failure");
             Log.e(LOG_TAG, " Error : ", error);
             deleteCallback.onDeleteFailure();
         }
     });
}

最后错误显示了这个

retrofit.RetrofitError: TimeTrackerWebServiceMethods.deleteLoggedHour: @Body parameters cannot be used with form or multi-part encoding. (parameter #1)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
        at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
        at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
        at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at retrofit.Platform$Android$2$1.run(Platform.java:142)
        at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.IllegalArgumentException: TimeTrackerWebServiceMethods.deleteLoggedHour: @Body parameters cannot be used with form or multi-part encoding. (parameter #1)
        at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:107)
        at retrofit.RestMethodInfo.parameterError(RestMethodInfo.java:111)
        at retrofit.RestMethodInfo.parseParameters(RestMethodInfo.java:387)
        at retrofit.RestMethodInfo.init(RestMethodInfo.java:118)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:294)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) 
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at retrofit.Platform$Android$2$1.run(Platform.java:142)
            at java.lang.Thread.run(Thread.java:856)

我做错了吗?

1 个答案:

答案 0 :(得分:3)

您可能会OkHttpRetrofit不支持在DELETE请求中发送正文。

这没关系,因为发送带有DELETE请求的正文是没有意义的。并且Http spec也没有明确禁止或阻止它。看到这个问题:Is an entity body allowed for an HTTP DELETE request

  

DELETE请求上的实体没有定义的语义。请注意   在DELETE请求上发送正文可能会导致一些现有的   拒绝请求的实现。