当前位置: 首页 > 知识库问答 >
问题:

需要Retrofi2 Android HTTP方法注释(例如,@GET,@POST等)

贺山
2023-03-14

Stacktrace:

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);
}

我的应用程序在调试(在虚拟和真实设备上)上运行良好,但在发布构建后,它在任何地方都无法运行(因为改型会引发错误)。我尝试了所有存在的方法来修复它,但任何一种都不起作用。

  1. 我的进口商品很好
  2. 我添加了守卫规则:
-keepattributes *Annotation*
-keep class retrofit.* { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>; }
-keepattributes Signature
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'
}
release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable false
            jniDebuggable false
            renderscriptDebuggable false
            renderscriptOptimLevel 3
            applicationIdSuffix '.aminoapps'
            multiDexEnabled true
        }

共有1个答案

吕霄
2023-03-14

这很奇怪,你可以试试这个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$*
 类似资料:
  • 我对我的修改代码有一个问题,我似乎缺少了什么,或者没有完全理解我需要做什么。这是我的错误的完整副本。我没有使用ProGuard,但我已经应用了所有的例外情况,如果你想要在规则集中,只是为了确保。对于调试和发布,Minify都设置为false。

  • 我使用的是改型2.1,当我调用@get时,它会说 现在..如果我定义@retrofit.http.get,它将抛出 以及方法 分级文件

  • 问题内容: 与调用代码: 该类实现了Callback,因此定义了成功/失败。 堆栈跟踪: 问题答案: 这意味着在运行时找不到注释。如果没有HTTP方法类型(及其包含的相对URL),则Retrofit无法发出请求。 您是否正在使用Proguard或其他工具来修剪“未使用”的代码?如果是这样,请指示其保留Retrofit的注释。

  • 主要内容:HTTP 请求:GET vs POST,jQuery $.get() 方法,实例,demo_test.php 文件代码:,jQuery $.post() 方法,实例,demo_test_post.php 文件代码:jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。 HTTP 请求:GET vs POST 两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。 GET - 从指定的资源请求数据 POST -

  • 我的目标是将以前使用Spring Boot 1.3开发的Spring Boot应用程序迁移到最新的Spring Boot 1.4版本。该应用程序由几个maven模块组成,其中只有一个包含用SpringBootApplication注释的类。 迁移的一部分是使用WebMvcTest注释来有效地测试控制器,这里我遇到了一个问题。 考虑Spring Boot github页面中的一个示例应用程序<代码>