需要Retrofit 2 HTTP方法注释(例如@ GET,@ POST等) [英] Retrofit 2 HTTP method annotation is required (e.g., @GET, @POST, etc.)
问题描述
我的改装配置出了什么问题?我在使用OkHttpClient添加基本身份验证时遇到此错误,但是当我使用没有Interceptor的默认客户端时,它将正常工作.或者我的Gradle依赖关系有问题..?
What's wrong with my Retrofit configuration? I'm having this error when I'm adding Basic Authentication with my OkHttpClient but when I used the default client without Interceptor it's working. Or is there something wrong with my Gradle Dependencies..?
E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalArgumentException
: HTTP method annotation is required (e.g., @GET, @POST, etc.).
for method APIService.getRegAccrDetails
at retrofit.Utils.methodError(Utils.java:177)
at retrofit.Utils.methodError(Utils.java:167)
at retrofit.RequestFactoryParser.parseMethodAnnotations(RequestFactoryParser.java:135)
at retrofit.RequestFactoryParser.parse(RequestFactoryParser.java:59)
at retrofit.MethodHandler.create(MethodHandler.java:30)
at retrofit.Retrofit.loadMethodHandler(Retrofit.java:151)
at retrofit.Retrofit$1.invoke(Retrofit.java:132)
at $Proxy0.getRegAccrDetails(Native Method)
at alvin.test.myapplication.MainActivity.liferayAccess(MainActivity.java:136)
at alvin.test.myapplication.MainActivity.access$000(MainActivity.java:28)
at alvin.test.myapplication.MainActivity$1.onClick(MainActivity.java:49)
at android.view.View.performClick(View.java:3511)
at android.view.View$PerformClick.run(View.java:14105)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
这是我要调用的API服务
Here is my API Service to be called
@GET("Triu-services-portlet.regaccrdetails/get-all-reg-accr-details-by-num-branch-code/num/{num}/branch-code/{branch-code}")
public Observable<List<RegAccrDetails>> getRegAccrDetails(@Path("num") String num, @Path("branch-code")String branchCode);
我的OkHttpClient拦截器
My OkHttpClient Interceptor
private static OkHttpClient createOkHttpClient() {
String username = "test@liferay.com";
String password = "TEST";
String credentials = username + ":" + password;
final String basic =
"Basic " + Base64.encodeToString(credentials.getBytes(), Base64.DEFAULT);//no_wrap
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Request original = chain.request();
// Customize the request
Request request = original.newBuilder()
.header("Authorization", basic)
.header("Accept", "application/json")
//.header("Authorization", "auth-token")//add token for service A4oslsSXZxfbLdk
.method(original.method(), original.body())
.build();
response = chain.proceed(request);
// Customize or return the response
return response;
}
});
return client;
}
这是我对我的API的呼唤
Here is my Call for my API
private void liferayAccess(){
Log.d("liferayAccess", "Entered");
APIService service = ServiceGenerator.createService(APIService.class);
Observable<List<RegAccrDetails>> liferayResponse = service.getRegAccrDetails("004589209", "001");
liferayResponse.subscribeOn(Schedulers.newThread()).map(listResponse -> "response index 0 " + listResponse.get(0).getRegNum())
.subscribe( response-> Log.d("Liferay Num", response),
error -> Log.d("Error", error.toString())
);
}
这是我的Gradle依赖项
Here is my Gradle Dependencies
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'io.reactivex:rxjava:1.0.16'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
//compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta2'
/*compile 'com.squareup.okhttp:okhttp:2.2.0'*/
compile ('com.squareup.retrofit2:retrofit:2.0.0-beta3') {//com.squareup.retrofit2:retrofit:2.0.0-beta3
// exclude Retrofit’s OkHttp peer-dependency module and define your own module import
//exclude module: 'okhttp'
}
compile 'com.squareup.okhttp3:okhttp:3.0.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
这是我的App Gradle文件
Here is my App Gradle File
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
defaultConfig {
applicationId "alvin.test.myapplication"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'io.reactivex:rxjava:1.0.16'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
//compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta2'
/*compile 'com.squareup.okhttp:okhttp:2.2.0'*/
compile ('com.squareup.retrofit2:retrofit:2.0.0-beta3') {//com.squareup.retrofit2:retrofit:2.0.0-beta3
// exclude Retrofit’s OkHttp peer-dependency module and define your own module import
//exclude module: 'okhttp'
}
compile 'com.squareup.okhttp3:okhttp:3.0.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
//compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.google.android.gms:play-services-gcm:7.3.0'
compile 'com.google.android.gms:play-services:7.8.0'
}
retrolambda {
jdk "C:\\Program Files\\Java\\jdk1.8.0_20"
}
我的Proguard.我也尝试添加和删除它,但是发生相同的错误日志
My Proguard. I also tried add and remove it but same error log happen
-keepattributes *Annotation*
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>; }
-keepattributes Signature
-keep class com.google.gson.** { *; }
-keep class com.google.inject.** { *; }
-keep class org.apache.http.** { *; }
-keep class org.apache.james.mime4j.** { *; }
-keep class javax.inject.** { *; }
-keep class retrofit.** { *; }
推荐答案
问题
您使用的beta2版本的改造插件依赖于beta2版本的改造,仍然存在于com.squreup.retrofit
软件包中.
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
然后,您要导入本身位于retrofit2
软件包中的改造版beta3版本.基本上,它可以与beta2版本一起使用.
Then you're importing beta3 version of retrofit itself which lives in retrofit2
package. Basically it can be used alongside beta2 version.
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
您根本没有真正使用beta3,因为它与beta2插件不兼容,并且会出现编译时错误.检查您的进口以进行验证.
You're not really using beta3 at all, because it's incompatible with beta2 plugins and you'd get compile time errors. Check your imports to verify.
发生的事情是(很可能)您使用com.square.retrofit
包中的所有内容,但@GET
类来自retrofit2
包中.尽管它们的名称相同,但这些类却不相同.
What happened is (most likely) you use everything from com.square.retrofit
package except for the @GET
class which is from retrofit2
package. Despite their identical name these classes are not the same.
移动到beta4和retrofit2
软件包.修复您的导入.利润.
Move to beta4 and retrofit2
package. Fix your imports. Profit.
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
这篇关于需要Retrofit 2 HTTP方法注释(例如@ GET,@ POST等)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!