webentwicklung-frage-antwort-db.com.de

Retrofit 2-HTTP-Methodenanmerkung ist erforderlich (z. B. @GET, @POST usw.)

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.** { *; }
12
DreamBigAlvin

Problem

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.

Lösung

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'
10
Eugen Pechanec

Verwenden des falschen "@GET"

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.

 enter image description here

36
Jraco11

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'
4
Harsh Sharma

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'
0
murt