未找到 Retrofit 注释。 (参数#1)

No Retrofit annotation found. (parameter #1)

我想从 URL 和 Retrofit 获取 RSS 代码,如果我在 get 注释中静态输入 url 一切正常,但使用动态 url 我得到一个错误。

我的界面服务:

public interface AllNewsService {
@GET("/fa/rss/{url}")
void getRss( @Path("url") String nGroup ,  Callback<AllNewsRss> callback);}

并调用 getRss 方法:

DataGetter dg = new DataGetter();
    dg.get().getRss("allnews" ,new Callback<AllNewsRss>() {
        @Override
        public void success(AllNewsRss allNewsRss, Response response) {
            Log.d(TAG,"success");
        }

        @Override
        public void failure(RetrofitError error) {
            Log.d("*********",error.toString());
        }

我收到以下错误:

retrofit.RetrofitError: AllNewsService.getRss: No Retrofit annotation found. (parameter #1)

注意: 我在 proguard.cfg 中添加了下面这行,但它不起作用

-keep class retrofit.** { *; }

你可能忘了先初始化适配器,如改造中所述 api:

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);

http://square.github.io/retrofit/

我的问题是我有 @POST 注释,但忘记了参数的 @Body 注释。

Destil 回答的补充

确保您传递给 retrofit interface methods(i.e callbacks, headers, body )parameters 只属于 retrofit package。例如不是您自己想要的自定义回调。

还要确保为所有参数添加 @Query@Field,具体取决于您是否发出 GET/POST.

例如:

@GET("/api/Books/GetAll")
void GetRecentBooks(@Query int Offset, Callback<List<Book>> cb);

请检查您正在使用的 Path class 并确保包是 retrofit2.http.Path 而不是 org.simpleframework.xml.Path。 这是一个常见的 Retrofit 注释错误。

就我而言,我只是在开始使用改造 2 时忘记删除服务调用的回调参数。确保你没有犯我犯的愚蠢错误。

我有 @Post 注释但忘记了 @Field@FormUrlEncoded 注释

改造接口中删除所有不属于此的参数。

我的问题是我正在使用 Kotlin 协程并在 Retrofit GET 方法中使用了 'suspend'。只需将其删除,一切正常。

太晚了,但我刚刚遇到了同样的问题。 我在改造界面和 viewModel 上使用带有 'deferred' 和 'await' 的改造 2.5.0。我从改造 github 中读到,从 2.6.0 开始 deferred 已被弃用,我们可以从 deferred 切换到 'suspend'。在我移动我的改造版本之前,我只是简单地从延迟更改为暂停并 运行 它,并得到了同样的错误。我通过将改造版本从 2.5.0 移动到 2.6.0 解决了这个问题。

我的观点是,您应用中的当前翻新版本可能不支持您在翻新相关 类 或界面中使用翻新的方式。

忘记补充了 @Field("")

之前

   @POST("/api/verify-phone")
    @FormUrlEncoded
    fun sendOTP(phone_number: String): Observable<SignInResponse?>

固定

@POST("/api/verify-phone")
@FormUrlEncoded
fun sendOTP(@Field("phone")phone_number: String): Observable<SignInResponse?>

当我像这样在网络服务接口中使用挂起功能时,这发生在我身上。

interface Service {
    @GET("chapters")
    suspend fun fetchChapters() : List<NetworkChapter>

我通过做两件事解决了这个问题。 1. 使用 Gson 代替 Moshi 库。从改造中移除 moshi 转换器并使用 Gson 转换器。 2.从改造中移除协程转换器工厂。我认为这是主要问题。

(Kotlin) 我在这里解决了:

//@FormUrlEncoded // Don't used
@POST("orders")
fun saveOrders(@Body orders: Orders): Call<OrdersResponse>

就我而言,我使用的是 Retrofit 2.5.0 而不是最新版本。更新到 2.9.0 又好了。

我的实际问题是老okhttp。即使更新到 2.6.0 也出现同样的错误。

okhttp_version = "3.12.1"//remove
okhttp_version = "4.4.0"//works

在我的例子中,我使用@Post 和@body 但使用多个选项而不是 class 当我使用给定对象而不是参数时它解决了我的问题

确保添加所有必需的依赖项:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.5.0'