Модифицируйте, как передавать параметры внутри строки GET

Я пытаюсь получить данные о погоде, передав текущую широту и долготу. Как я могу передать эти две переменные в строке запроса Retrofit Get Query?

Пожалуйста, проверьте код ниже, я хочу заменить {lat} и {lon} значением, которое я передаю

@GET("yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22({lat},{lon})%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")
Call<YahooWeather> getWeatherData(@Path("lat") String lat, @Path("lon") String lon);

Вот мой клиентский интерфейс YahooWeatherClient.java

public interface YahooWeatherClient {
    @GET("yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22({lat},{lon})%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")
    Call<YahooWeather> getWeatherData(@Path("lat") String lat, @Path("lon") String lon);
}

Вот активность RetrofitActivity.java

public class RetrofitActivity extends AppCompatActivity {
    private static final String TAG = RetrofitActivity.class.getSimpleName();
    YahooWeatherClient mYahooWeatherClient;

    TextView messageTV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);

        messageTV = (TextView) findViewById(R.id.message);

        initializeRetrofit();
        getWeatherData();
    }

    private void initializeRetrofit() {
        String BASE_URL = "https://query.yahooapis.com/v1/public/";

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

        mYahooWeatherClient = retrofit.create(YahooWeatherClient.class);
    }

    private void getWeatherData() {
        Call<YahooWeather> weatherCall = mYahooWeatherClient.getWeatherData("23.780833", "90.349417");
        weatherCall.enqueue(new Callback<YahooWeather>() {
            @Override
            public void onResponse(Call<YahooWeather> call, Response<YahooWeather> response) {
                YahooWeather weather = response.body();
                messageTV.setText(weather.getQuery().getResults().getChannel().getAstronomy().getSunrise());
                Log.d(TAG, weather.getQuery().getResults().getChannel().getAstronomy().getSunrise());

            }

            @Override
            public void onFailure(Call<YahooWeather> call, Throwable t) {
                messageTV.setText(t.getMessage());
                Log.e(TAG, t.getMessage());
            }
        });
    }

}

Журнал ошибок:

                  --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: net.deviac.retrofitsample, PID: 3576
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{net.deviac.retrofitsample/net.deviac.retrofitsample.RetrofitActivity}: java.lang.IllegalArgumentException: URL query string "q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22({lat},{lon})%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" must not have replace block. For dynamic query parameters use @Query.
                      for method YahooWeatherClient.getWeatherData
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                   Caused by: java.lang.IllegalArgumentException: URL query string "q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22({lat},{lon})%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" must not have replace block. For dynamic query parameters use @Query.
                      for method YahooWeatherClient.getWeatherData
                      at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720)
                      at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:711)
                      at retrofit2.ServiceMethod$Builder.parseHttpMethodAndPath(ServiceMethod.java:297)
                      at retrofit2.ServiceMethod$Builder.parseMethodAnnotation(ServiceMethod.java:242)
                      at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:170)
                      at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166)
                      at retrofit2.Retrofit$1.invoke(Retrofit.java:145)
                      at java.lang.reflect.Proxy.invoke(Proxy.java:397)
                      at $Proxy0.getWeatherData(Unknown Source)
                      at net.deviac.retrofitsample.RetrofitActivity.getWeatherData(RetrofitActivity.java:45)
                      at net.deviac.retrofitsample.RetrofitActivity.onCreate(RetrofitActivity.java:30)
                      at android.app.Activity.performCreate(Activity.java:5990)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                        ... 10 more

person Simon Gomes    schedule 06.02.2017    source источник
comment
С какой проблемой вы столкнулись?   -  person Sangharsh    schedule 06.02.2017
comment
@Sangharsh, пожалуйста, проверьте вопрос ... На самом деле я хочу передать широту и долготу в строке запроса GET вместо {lat} и {lon}   -  person Simon Gomes    schedule 06.02.2017
comment
Ваш код, кажется, делает это. Разве это не помещает lat, lon в строку запроса? Что такое строка запроса в исходящем запросе?   -  person Sangharsh    schedule 06.02.2017
comment
Что такое пример URL? Возможно, вы хотите использовать @Query вместо @Path?   -  person Eric Cochran    schedule 07.02.2017
comment
@Sangharsh нет, он не работает в строке запроса, он передает {lat} {lon}, а не число, которое я передаю. Вы хотите, чтобы я обновил вопрос с кодом активности и журналом ошибок?   -  person Simon Gomes    schedule 07.02.2017
comment
@EricCochran, если это возможно сделать с помощью Query, не могли бы вы показать мне, как это сделать?   -  person Simon Gomes    schedule 07.02.2017
comment
@Simon github.com/square/retrofit/blob/   -  person Eric Cochran    schedule 07.02.2017
comment
@EricCochran, это не тот приятель. Я хочу заменить что-то внутри строки запроса вместо того, чтобы передавать дополнительный запрос после URL-адреса.   -  person Simon Gomes    schedule 07.02.2017
comment
Попался. поэтому я и попросил пример. Вам придется сделать что-то умное в перехватчике OkHttp или построить полный запрос на сайте вызова.   -  person Eric Cochran    schedule 07.02.2017
comment
Давайте продолжим обсуждение в чате.   -  person Simon Gomes    schedule 07.02.2017


Ответы (2)


Вы можете передать параметры запроса в Retrofit, например:

@GET("/yql")     //url which u want to pass the parameter 
void getSummary(@Query("lat") String lat,@Query("lon") String lon, Callback<YahooWeather> callback);

Приведенный выше URL-адрес будет передан следующим образом:

www.example.com/yql?lat=123.11&lon=132.12
person Gokul    schedule 07.02.2017
comment
Спасибо, но это не то, что я ищу, я знаю это - person Simon Gomes; 07.02.2017

Я сделал нечто подобное в своем проекте. Я использовал модификацию, чтобы отправить текущую широту и долготу на сервер и получить ответ от сервера. Вот пример кода.

Обновление интерфейса

import java.util.List;
import java.util.StringTokenizer;
import in.invis.organickerala.modelclass.Medias;
import in.invis.organickerala.modelclass.NotificationDetail;
import in.invis.organickerala.modelclass.NotificationList;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by VishnuM on 1/9/2017.
 */

public interface RegisterApi {

    @GET("orgkerala_poi.php")
    Call<List<Medias>>getResponse1(@Query("lat") Double lat, @Query("lon") Double lon);


    @GET("orgkerala_poi.php")
    Call<ResponseBody> getResponse2(@Query("lat") Double lat, @Query("lon") Double lon);

    @GET("orgpoi_detail.php")
    Call<List<NotificationDetail>> getResponse3(@Query("id") int id);

    @GET("orgpoi_detail.php")
    Call<ResponseBody> getResponse4(@Query("id") int id);

    @GET("orgpoi_list.php")
    Call<List<NotificationList>> getResponse5(@Query("id") int id);

    @GET("orgpoi_list.php")
    Call<ResponseBody> getResponse6(@Query("id") int id);


}

Код Java для получения ответа при передаче широты и долготы

public  boolean download(  double lat,
                               double lon) {

         Log.d("Download","asbdah");
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ROOT_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RegisterApi apiservice =retrofit.create(RegisterApi.class);
        final Call<List<Medias>> detailresponse = apiservice.getResponse1(lat,lon);

        detailresponse.enqueue(new Callback<List<Medias>>() {
            @Override
            public void onResponse(Call<List<Medias>> call, Response<List<Medias>> response) {
                Log.d("asd00", "" + response);
                Log.d("asd00", "" + response.body().toString());
                Log.d("Resp112",""+ call.request().url().toString());

                // medias = response.body();
                // Log.d("mediasize",""+medias);
                media = (ArrayList<Medias>) response.body();

                Log.d("mediasize11",""+media.size());
            }

            @Override
            public void onFailure(Call<List<Medias>> call, Throwable t) {

            }
        });

Если вы пытаетесь сделать это и вам нужна помощь, пингуйте меня. Спасибо

person Vishnu M Menon    schedule 07.02.2017