簡體   English   中英

Retrofi2 Android HTTP 方法注釋是必需的(例如,@GET,@POST等)

[英]Retrofi2 Android HTTP method annotation is required (e.g., @GET, @POST, etc.)

堆棧跟蹤:

retrofit2.Utils.methodError(Utils.java:54)
retrofit2.Utils.methodError(Utils.java:43)
retrofit2.RequestFactory$Builder.build(RequestFactory.java:185)
retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:67)
retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:26)
retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
retrofit2.Retrofit$1.invoke(Retrofit.java:160)
java.lang.reflect.Proxy.invoke(Proxy.java:913)
$Proxy0.login(Unknown Source)
space.apia11.aminorage.data.LoginDataSource.loginByEmailPass(LoginDataSource.java:64)
space.apia11.aminorage.data.LoginDataSource.tryLoginByEmailPass(LoginDataSource.java:55)
space.apia11.aminorage.data.LoginDataSource.login(LoginDataSource.java:30)
space.apia11.aminorage.data.LoginRepository.login(LoginRepository.java:49)
space.apia11.aminorage.ui.login.LoginViewModel.lambda$login$0$LoginViewModel(LoginViewModel.java:38)
space.apia11.aminorage.ui.login.-$$Lambda$LoginViewModel$UZa92bMCpj4JHIBNvF-_hLtQ3UE.run(Unknown Source:6)
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
java.lang.Thread.run(Thread.java:764)
java.lang.IllegalArgumentException: HTTP method annotation is required (e.g., @GET, @POST, etc.).
    for method Api.login
HTTP method annotation is required (e.g., @GET, @POST, etc.).
    for method Api.login

界面:

package space.apia11.aminorage.aminoapps.request;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import space.apia11.aminorage.aminoapps.model.api.answer.ApiAnswer;
import space.apia11.aminorage.aminoapps.model.api.answer.GetMembersAnswer;
import space.apia11.aminorage.aminoapps.model.api.answer.GetMyCommunitiesAnswer;
import space.apia11.aminorage.aminoapps.model.api.answer.GetOnlineMembersAnswer;
import space.apia11.aminorage.aminoapps.model.api.answer.LoginAnswer;
import space.apia11.aminorage.aminoapps.model.api.answer.SearchCommunityAnswer;
import space.apia11.aminorage.aminoapps.model.api.request.CreateThreadBody;
import space.apia11.aminorage.aminoapps.model.api.request.LoginBody;
import space.apia11.aminorage.data.model.User;

public interface Api {

  default Call<SearchCommunityAnswer> searchCommunity(String searchInput) {
    return searchCommunity(searchInput, "ru");
  }

  @GET("g/s/community/search")
  Call<SearchCommunityAnswer> searchCommunity(@Query("q") String searchInput,
      @Query("language") String language);

  @GET("x{ndcId}/s/user-profile?type=recent&start=0&size=0")
  Call<GetMembersAnswer> getCommunityMembers(@Query("ndcId") int ndcId);

  default Call<GetMyCommunitiesAnswer> getMyCommunities(int start, int size) {
    return getMyCommunities(1, start, size,
        "sid=" + User.getInstance().getSid());
  }

  @GET("g/s/community/joined")
  Call<GetMyCommunitiesAnswer> getMyCommunities(@Query("v") int v, @Query("start") int start,
      @Query("size") int size,
      @Header("NDCAUTH") String sid);

  default Call<LoginAnswer> login(String email, String password) {
    LoginBody body = new LoginBody(email, "0 " + password);
    return login(body);
  }

  @POST("g/s/auth/login")
  Call<LoginAnswer> login(@Body LoginBody body);

  default Call<ApiAnswer> joinCommunity(int ndcId) {
    return joinCommunity(ndcId,
        "sid=" + User.getInstance().getSid());
  }

  @POST("x{ndcId}/s/community/join")
  Call<ApiAnswer> joinCommunity(@Path("ndcId") int ndcId, @Header("NDCAUTH") String sid);

  default Call<ApiAnswer> createThread(int ndcId, String content, String... UIds) {
    CreateThreadBody body = new CreateThreadBody(content, UIds);
    return createThread(ndcId, "sid=" + User.getInstance().getSid(), body);
  }

  @POST("x{ndcId}/s/chat/thread")
  Call<ApiAnswer> createThread(@Path("ndcId") int ndcId, @Header("NDCAUTH") String sid,
      @Body CreateThreadBody body);

  default Call<GetOnlineMembersAnswer> getOnlineMembers(int ndcId, int start, int size) {
    return getOnlineMembers(ndcId, "ndtopic:x" + ndcId + ":online-members", start, size);
  }

  @GET("x{ndcId}/s/live-layer")
  Call<GetOnlineMembersAnswer> getOnlineMembers(@Path("ndcId") int ndcId,
      @Query("topic") String topic, @Query("start") int start, @Query("size") int size);
}

我的應用程序在調試時工作正常(在虛擬和真實設備上),但在發布構建后它不能在任何地方工作(因為 Retrofit 拋出錯誤)。 我嘗試了所有存在的方法來修復它,但任何一個都不起作用。

  1. 我的進口很好。
  2. 我添加了proguard規則:
-keepattributes *Annotation*
-keep class retrofit.* { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>; }
-keepattributes Signature
  1. 我的依賴:
dependencies {
    implementation 'org.jetbrains:annotations:19.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    compileOnly 'org.projectlombok:lombok:1.18.18'
    annotationProcessor 'org.projectlombok:lombok:1.18.18'
    testCompileOnly 'org.projectlombok:lombok:1.18.18'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.18'
    implementation 'com.fasterxml.jackson.core:jackson-core:2.12.1'
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.1'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-jackson:2.9.0'
    implementation 'androidx.core:core:1.5.0-beta01'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.3.1'
    implementation 'com.squareup.okhttp3:okhttp:4.3.1'

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.annotation:annotation:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
  1. 我的構建類型:
release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable false
            jniDebuggable false
            renderscriptDebuggable false
            renderscriptOptimLevel 3
            applicationIdSuffix '.aminoapps'
            multiDexEnabled true
        }

很奇怪,你可以試試這個proguard規則看看它是否有效

# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**

# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM