Was ist los mit meiner Retrofit-Konfiguration? Ich habe diesen Fehler, wenn ich Basic Authentication mit meinem OkHttpClient hinzufüge, aber wenn ich den Standard-Client ohne Interceptor verwendet habe, funktioniert es. Oder stimmt etwas mit meinen Gradle-Abhängigkeiten nicht?
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)
Hier soll mein API-Service aufgerufen werden
@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);
Mein OkHttpClient Interceptor
private static OkHttpClient createOkHttpClient() {
String username = "[email protected]";
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;
}
Hier ist mein Aufruf für meine 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())
);
}
Hier sind meine Gradle-Abhängigkeiten
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'
Hier ist meine App-Gradle-Datei
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"
}
Mein Proguard Ich habe auch versucht, es hinzuzufügen und zu entfernen, aber das gleiche Fehlerprotokoll wird angezeigt
-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.** { *; }
Sie verwenden Beta2-Versionen von Retrofit-Plugins, die von der Beta2-Version von Retrofit abhängen, die noch im com.squreup.retrofit
-Paket enthalten ist.
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
Dann importieren Sie die Beta3-Version von Retrofit selbst, die im retrofit2
-Paket lebt. Grundsätzlich kann es neben der Beta2-Version verwendet werden.
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
Sie verwenden Beta3 eigentlich gar nicht, weil sie mit Beta2-Plugins nicht kompatibel ist und Sie Zeitfehler beim Kompilieren bekommen würden. Überprüfen Sie Ihre Importe, um dies zu überprüfen.
Was passiert ist, ist (am wahrscheinlichsten), dass Sie alles aus dem com.square.retrofit
-Paket verwenden, mit Ausnahme der @GET
-Klasse, die aus dem retrofit2
-Paket stammt. Trotz ihres identischen Namens sind diese Klassen nicht gleich.
Wechseln Sie in das Paket beta4 und retrofit2
. Korrigieren Sie Ihre Importe. Profitieren.
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'
Dies könnte jemandem helfen, der von Retrofit1 kommt. Ich habe den gleichen Fehler erhalten und das Update war einfach. In meiner Benutzeroberfläche wusste ich nicht, dass ich @GET von retrofit.http und nicht @GET von retrofit2.http verwendete. Die Annotation von retrofit.http in retrofit2.http war alles, was ich tun musste.
Es sieht so aus, als würden Sie proguard verwenden und es entfernt Kommentare. Um davon gerettet zu werden, fügen Sie diese Zeilen in Ihre proguard-rules.pro ein.
-keepattributes *Annotation* -keep class retrofit.** { *; } -keepclasseswithmembers class * { @retrofit.http.* <methods>; } -keepattributes Signature
wenn Sie Proguard nicht verwenden, vergewissern Sie sich, dass Sie nichts in Ihrer App build.gradle sowas geschrieben haben
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
}
}
Hinweis: In der Standardversion von javax.annotation ist Android normalerweise nicht in der Standardausstattung enthalten.
wenn dies nicht der Fall ist, fügen Sie dies in Ihre Gradle-Abhängigkeit ein (build.gradle).
provided 'org.glassfish:javax.annotation:10.0-b28'
Wie Eugen Pechanec feststellte, liegt das Problem in der Regel im Konflikt zwischen Retrofit und Retrofit 2. In meinem Fall wurde der Fehler "Annotation der HTTP-Methode ist @GET @POST" durch die Verwendung eines falschen Struktur-Builders von HTTPLoggingInterceptor) verursacht.
Stellen Sie daher sicher, dass Sie okhttp3 mit retrofit2 verwenden.
Die richtige Struktur sieht also so aus: THIS :
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
...
Retrofit provideRetrofit(){
// get base url for endpoint
String endpointUrl = BuildConfig.apiEndpointUrl;
// add logging interceptor
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).build();
// build retrofit instance
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(endpointUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit;
}
Und die app/build.gradle
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'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'