API returns 404 改造

API returns 404 to Retrofit

我有一个 API,其中 returns 一个简单的 JSON 响应就很好(响应代码 200)。但是当我从我的 android 应用请求相同的 URL 时,它得到 404.

这里是依赖项

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.6.0'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.google.code.gson:gson:2.4'

这是我的界面

public interface ExampleApi {
    @GET("/test/drink/")
    Call<Example> getExample();
}

这些代码在 MainActivity运行

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://localpro.herokuapp.com/api")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

ExampleApi api = retrofit.create(ExampleApi.class);
Call<Example> call = api.getExample();
call.enqueue(new Callback<Example>() {
    @Override
    public void onResponse(Response<Example> response, Retrofit retrofit) {
        try {
            Log.i("Response code", " " + response.code());
            Log.i("Response", " " + response.body().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onFailure(Throwable t) {
    }
});

日志

12-11 16:59:44.235 8885-8885/com.wealthpack.retrofitfinal I/Response code:  404 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at com.wealthpack.retrofitfinal.MainActivity.onResponse(MainActivity.java:45) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at retrofit.ExecutorCallAdapterFactory$ExecutorCallback.run(ExecutorCallAdapterFactory.java:86)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at android.os.Handler.handleCallback(Handler.java:746) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at android.os.Looper.loop(Looper.java:148) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5443) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at java.lang.reflect.Method.invoke(Native Method) 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

注意:我完全不熟悉 Android 开发并在几年后使用 Java。

请求您的服务

new Thread(new Runnable() {
    @Override
    public void run() {
        Response response = App.retrofit().buildRequest(TestActivity.this).universityService().getExample(); //getExample("json")
        if(response.getStatus() == 200){
            System.out.println(response.getBody().toString());
        }else{
            System.out.println(response.getStatus());
        }
    }
}).start();

获得您的服务

@GET("/test/drink/")
Response getExample();

@GET("/test/drink/")
Response getExample(@Query("format") String format);

您的模特

public class Example {
    public boolean success;
    public List<Drink> drinks;
}

public class Drink {
    public String name;
    public String description;
}   

Retrofit适配器,我用的是1.9.0版本的retrofit

private static final String url = "http://localpro.herokuapp.com/api";

restAdapter = new RestAdapter.Builder()
            .setEndpoint(url)
            .build();

这对我有用。

这是语法问题,

你必须这样写你的服务:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://localpro.herokuapp.com/api/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

public interface ExampleApi {
@GET("test/drink/")
Call<Example> getExample();

有关更多详细信息,请查看 Jake Wharton https://youtu.be/KIAoQbAu3eA?t=32m24s :)

的精彩演示