java - 如何向 Retrofit Java 接口(interface)上的 @GET() 方法传递一些参数?

标签 java android json gson retrofit

我正在使用 wunderground API 制作一个天气应用程序。我还使用 Retrofit2 和 GSON 库。

以下是获取 JSON 响应的 API URL 格式:

http://api.wunderground.com/api/API_KEY/conditions/q/ISO_COUNTRY_CODE/CITY_NAME.json

我声明了一个 java API_Interface,如下所示:

public interface API_Interface {

    @GET("/api/{apikey}/conditions/q/BD/{city}.json")
    Call<CurrentObservation> getCurrentWeather(
            @Path("apikey") String apikey,
            @Path("city") String city);
}

并尝试从 MainActivity 传递 apikeycity,如下所示:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        API_Interface weatherService = retrofit.create(API_Interface.class);
        Call<CurrentObservation> call = weatherService.getCurrentWeather(Constants.API_KEY,"Dhaka");

        call.enqueue(new Callback<CurrentObservation>() {
            @Override
            public void onResponse(Call<CurrentObservation> call, Response<CurrentObservation> response) {
                textView.setText(response.body().toString());
                Log.d("result",response.body().toString());
            }

            @Override
            public void onFailure(Call<CurrentObservation> call, Throwable t) {
                textView.setText("Something went wrong: " + t.getMessage());
                Log.e("error",t.getMessage());
            }
        });

这是Constant 类:

public class Constants {
    public static final String BASE_URL="http://api.wunderground.com";
    public static final String API_KEY="b5efba6dc63cc1b1";
}

这是 CurrentObservation 类的 POJO 模型:http://paste.ubuntu.com/22291964/ 我已经重写了模型中的 toString() 方法。

还有一些其他 POJO 类 -

enter image description here

但是这种方法给出了空响应,如下所示-

Weather Status: null
Pressure: null
Humidity: null
Temperature: null

这是来自 API URL 的实际 JSON 响应 - http://paste.ubuntu.com/22292683/

如何将参数传递给@GET以获得正确的响应?

最佳答案

您的基本网址应如下所示:

http://blah.com/api/blah/   

你的@GET方法应该有一个像这样的URL

api/{apikey}/conditions/q/BD/{city}.json

编辑:您可能使用错误正文调用了onResponse。请根据您的用例调整以下代码:

public static boolean handleError(Retrofit retrofit, Response<?> response) {
    if(response != null && !response.isSuccessful() && response.errorBody() != null) {
        Converter<ResponseBody, ErrorResponse> converter = retrofit.responseBodyConverter(ErrorResponse.class, new Annotation[0]);
        try {
            ErrorResponse errorResponse = converter.convert(response.errorBody());
            // do something
        } catch(IOException e) {
            Log.e(TAG, "An error occurred", e);
        }
        return true;
    }
    return false;
}

关于java - 如何向 Retrofit Java 接口(interface)上的 @GET() 方法传递一些参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38784849/

相关文章:

java - 未调用静态对象的 Android ctor

java - 获取通过 Java Servlet 中的 jquery ajax 发送的参数

java - notifyAll 是否在不检查条件的情况下从循环中删除等待?

java - 如何创建多对多实体的命名查询?

java - 使用 SearchView android studio 在工具栏中留下空间

java - Android StaggeredGrid中如何在Adapter中填充数据并加载到Gridview

arrays - 使用 jq 将 JSON 对象转换为字符串数组

Java CompletableFuture.anyOf(manyfutures).thenRun( runnable ) 只运行一次

java - 如何设置并显示本地数据库中的另一个字段?

java - 获取分成几部分的字符串的长度