我想从带有
Retrofit
的 URL 获取 RSS 代码,如果我在获取注释中静态输入 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.** { *; }
我的问题是我有
@POST
注释,但忘记了参数的 @Body
注释。
Destil 答案的补充
确保您传递给
parameters
的 retrofit interface methods(i.e callbacks, headers, body )
仅属于 retrofit package
。例如不是您想要的自定义回调。
还要确保为所有参数添加
@Query
或 @Field
,具体取决于您是否发出 GET/POST。
例如:
@GET("/api/Books/GetAll")
void GetRecentBooks(@Query int Offset, Callback<List<Book>> cb);
太晚了,但我也遇到了同样的问题。 我在改造界面和 viewModel 上使用了带有“延迟”和“等待”的改造 2.5.0。我从 Retrofit github 上了解到,从 2.6.0 开始,延迟已被弃用,我们可以从延迟切换到“暂停”。在我升级改造版本之前,我只是简单地从延迟更改为暂停并运行它,并得到了相同的错误。我通过将改造版本从 2.5.0 移动到 2.6.0 解决了这个问题。
我的观点是,也许您的应用程序中当前的改造版本可能不支持您在改造相关的类或接口中使用改造的方式。
我的问题是我正在使用 Kotlin 协程并在 Retrofit GET 方法中使用了“挂起”。只需将其删除,一切正常。
我有
@Post
注释,但忘记了 @Field
和 @FormUrlEncoded
注释
如果您要发帖,则需要包含@Body
(Kotlin)我在这里解决了:
//@FormUrlEncoded // Don't used
@POST("orders")
fun saveOrders(@Body orders: Orders): Call<OrdersResponse>
就我而言,我使用的是 Retrofit 2.5.0 而不是最新版本。更新到 2.9.0,一切又恢复正常了。
您可能忘记首先初始化适配器,如改造 API 中所述:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);
请检查您正在使用的
Path
类,并确保包是retrofit2.http.Path
而不是org.simpleframework.xml.Path
。
这是一个常见的 Retrofit 注释错误。
从retrofit界面中删除所有不属于此的参数。
确保添加所需的所有依赖项:
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'
就我而言,当我开始使用改造2时,我只是忘记删除服务调用的回调参数。确保你没有犯我犯的愚蠢错误。
我忘了补充
@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.从改造中删除协程转换器工厂。我认为这是主要问题。
对我来说实际问题是旧的okhttp。即使将改造更新到 2.6.0,也会出现同样的错误。
okhttp_version = "3.12.1"//remove
okhttp_version = "4.4.0"//works
在我的例子中,我使用@Post和@body,但当我使用给定对象而不是参数时,使用多个选项而不是类,它解决了我的问题
就我而言,我忘记将 @HeaderMap 放入我的 POST 调用中。它没有任何主体,只有标题。