【问题标题】:Retrofit HTTP method annotation is required需要改造 HTTP 方法注解
【发布时间】:2016-11-16 16:54:19
【问题描述】:

我正在使用改造 2.1,当我调用 @GET 时,它说

HTTP method annotation is required (e.g., @GET, @POST, etc.).

现在.. 如果我定义 @retrofit.http.GET 它会抛出

No Retrofit annotation found. (parameter #1)

使用@POST 没关系,它的工作原理!

这是我的 HTTP 方法的错误日志...

11-15 12:11:20.423 25033-25506/com.app.garuda.ridernet E/UncaughtException: java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                at android.os.AsyncTask$3.done(AsyncTask.java:300)
                                                                                at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                                at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                at java.lang.Thread.run(Thread.java:841)
                                                                             Caused by: retrofit.RetrofitError: gitapi.getquery: HTTP method annotation is required (e.g., @GET, @POST, etc.).
                                                                                at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
                                                                                at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
                                                                                at $Proxy0.getquery(Native Method)
                                                                                at com.app.garuda.ridernet.SignIn.getjson(SignIn.java:92)
                                                                                at com.app.garuda.ridernet.SignIn.access$100(SignIn.java:28)
                                                                                at com.app.garuda.ridernet.SignIn$download.doInBackground(SignIn.java:125)
                                                                                at android.os.AsyncTask$2.call(AsyncTask.java:288)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                                at java.lang.Thread.run(Thread.java:841) 
                                                                             Caused by: java.lang.IllegalArgumentException: gitapi.getquery: HTTP method annotation is required (e.g., @GET, @POST, etc.).
                                                                                at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:107)
                                                                                at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:179)
                                                                                at retrofit.RestMethodInfo.init(RestMethodInfo.java:117)
                                                                                at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:294)
                                                                                at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
                                                                                at $Proxy0.getquery(Native Method) 
                                                                                at com.app.garuda.ridernet.SignIn.getjson(SignIn.java:92) 
                                                                                at com.app.garuda.ridernet.SignIn.access$100(SignIn.java:28) 
                                                                                at com.app.garuda.ridernet.SignIn$download.doInBackground(SignIn.java:125) 
                                                                                at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                                at java.lang.Thread.run(Thread.java:841) 

我的界面:

 import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.http.Field;
 import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.GET; 
 import retrofit2.http.POST;
 import retrofit2.http.Query;


 public interface Testapi {


    @GET("/getq.php")
    Call<Testmodel> getquery(
            @Query("sort") String order
    );


    @FormUrlEncoded
    @POST("/insert.php")
    Call<ResponseBody> insert(
            @Field("nick") String nick,
            @Field("mail") String mail
    );

}

还有方法

private void getjson() {
    //Creating a rest adapter

    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build();

    //Creating an object of our api interface
    Testapi api = adapter.create(Testapi.class);
    Call<Testmodel> call = api.getquery("a");

    call.enqueue(new Callback<Testmodel>() {
        @Override
        public void onResponse(Call<Testmodel> call, Response<Testmodel> response) {
            try {
                Testmodel obj = response.body();

                TextView txt = (TextView) findViewById(R.id.textView);
                txt.setText("ID: " + obj.getId() + "   nick: " + obj.getNick() + "   mail: " + obj.getMail());

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<Gitmodel> call, Throwable throwable) {
            Toast.makeText(SignIn.this, "FALLIMENTO",     Toast.LENGTH_LONG).show();
        }
    });


}

Gradle 文件

    apply plugin: 'com.android.application'

android {
compileSdkVersion 24
buildToolsVersion "23.0.2"
defaultConfig {

    multiDexEnabled true
    applicationId "xxx"
    minSdkVersion 17
    targetSdkVersion 24
    versionCode 1
    versionName "0.1"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
 }



dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])

   androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',  {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile files('libs/retrofit-2.1.0.jar')
compile files('libs/gson-2.7.jar')
compile files('libs/okhttp-3.4.1.jar')
compile files('libs/okio-1.11.0.jar')

compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.google.android.gms:play-services:9.2.1'
compile 'com.android.support:design:24.1.1'
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services-maps:9.2.1'
testCompile 'junit:junit:4.12'
}



apply plugin: 'com.google.gms.google-services'

【问题讨论】:

  • 试试这个 @GET("getq.php") 并在你的 baseURL 上加上反斜杠。
  • 尝试使用通用响应 (ResponseBody) 更改 Call 中的 TestModel,看看问题是否与预期响应无关。
  • 删除“/”没有解决,抛出“URL路径“getq.php”必须以'/'开头。”
  • 使用ResposeBody也是一样,需要方法还是参数#1
  • 可以分享一下gradle构建文件吗?

标签: android retrofit2


【解决方案1】:

首先请检查您在所有使用 Retrofit 的类中的导入。

在您的接口 Testapi 中,您使用了 retrofit2,但在您的方法 getjson() 中,您创建的是 retrofit.RestAdapter 而不是 retrofit2.Retrofit,这绝对是错误的。

请解决此问题并检查它是否正常工作。

PS。这是关于从 reftrofit 1.* 迁移到 2.* 的非常好的教程。跟随他们,一切都应该正常工作:

https://futurestud.io/tutorials/retrofit-2-upgrade-guide-from-1-9 https://inthecheesefactory.com/blog/retrofit-2.0/en

为什么不直接从maven 使用retrofit2 gradle 依赖呢? - 例如在附加链接中。

【讨论】:

    【解决方案2】:

    @POST注解方法,必须有参数,标记为@Body
    示例:

    @POST("/user/mobile/verify")
    VerifyCodeResponse verifyMobile(@Body VerifyRequest request);
    

    【讨论】:

    • 这不是真的,请阅读@FormUrlEncoded。此外,您似乎使用的是 2.0 之前的 Retrofit 版本。而问题显然是针对 2.0 以上的版本。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2013-04-26
    • 2016-05-27
    • 2022-10-15
    相关资源
    最近更新 更多