获取METHOD GET JSON改造

时间:2019-06-14 11:49:56

标签: android json get retrofit2

我正在尝试做一个GET方法,该方法接收带有改型的json,但是它给我一个错误。我不知道这是因为我没有正确传递参数还是没有很好地定义Object类。

public class MainActivity extends AppCompatActivity {

    Retrofit retrofit;
    WeatherAPI weatherAPI;
    String locationCurrent = "Barcelona";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        retrofit = new Retrofit.Builder()
                .baseUrl("http://api.apixu.com/v1/")
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        weatherAPI =retrofit.create(WeatherAPI.class);
        weatherGET(locationCurrent);

    }
    void weatherGET(final String  location){
        Call<Object> call = weatherAPI.getWeather(location);
        call.enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call <Object> call, Response<Object> response) {
                Log.d("%%%%%","Entrada");
                Object dataGETWeather;
                dataGETWeather = response.body();         Log.d("Temp",String.valueOf(dataGETWeather.CurrentObject.getTemp_c()));
            }
            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                Log.d("%%%%%","Salida");

            }
        });
    }
}

服务定义:

public interface WeatherAPI {

    @GET("current.json?key=9aa4f8a0b09c4034b44183812191306&q={location}")
    @Headers("Accept:application/json")
    Call<Object> getWeather(@Query("location") String location);

}

要接收的对象:

// The father of the object is this, but it has more subdivisions
public class Object {
    Location LocationObject;
    Current CurrentObject;


    // Getter Methods
    public Location getLocation() {
        return LocationObject;
    }

    public Current getCurrent() {
        return CurrentObject;
    }

    // Setter Methods

    public void setLocation(Location locationObject) {
        this.LocationObject = locationObject;
    }

    public void setCurrent(Current currentObject) {
        this.CurrentObject = currentObject;
    }
}

异常日志:

019-06-14 13:36:36.236 14987-14987/com.example.weatherapiE/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.weatherapi, PID: 14987
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.weatherapi/com.example.weatherapi.MainActivity}: java.lang.IllegalArgumentException: URL query string "key=9aa4f8a0b09c4034b44183812191306&q={location}" must not have replace block. For dynamic query parameters use @Query.
    for method WeatherAPI.getWeather
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)   

3 个答案:

答案 0 :(得分:0)

从终点网址中删除&q = {位置}

@GET("current.json?key=9aa4f8a0b09c4034b44183812191306")

答案 1 :(得分:0)

您应该像这样更改WeatherAPI界面:

public interface WeatherAPI {
    @GET("current.json?key=9aa4f8a0b09c4034b44183812191306")
    @Headers("Accept:application/json")
    Call<Object> getWeather(@Query("q") String location);
}

您的参数位置将作为“ q”(在@Query批注中指定)添加到查询字符串。

答案 2 :(得分:0)

以此更改您的界面

    @GET("current.json")
    @Headers("Accept:application/json")
    Call<Object> getWeather(@Query("key") String key,@Query("location") String location);