我尽我所能,但它仍然无效。我已经使用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)
我做错了吗?
答案 0 :(得分:3)
您可能会OkHttp
和Retrofit
不支持在DELETE
请求中发送正文。
这没关系,因为发送带有DELETE请求的正文是没有意义的。并且Http spec也没有明确禁止或阻止它。看到这个问题:Is an entity body allowed for an HTTP DELETE request?
DELETE请求上的实体没有定义的语义。请注意 在DELETE请求上发送正文可能会导致一些现有的 拒绝请求的实现。