2017-02-06 5 views
0

현재 위도와 경도를 전달하여 기상 데이터를 얻으려고합니다. Retrofit Get Query 문자열에서이 두 변수를 어떻게 전달할 수 있습니까? 나는 통과 여기 GET 문자열에 매개 변수를 전달하는 방법을 개조하십시오.

@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); 
} 

내가 값으로 {lat}{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()); 
      } 
     }); 
    } 

} 
입니다

Err 또는 로그 :

    --------- 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 
+0

에 직면하고 어떤 문제 :

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

위의 URL처럼 전달 될 것인가? – Sangharsh

+0

@Sangharsh 질문을 확인하십시오 ... 실제로 위도와 경도를 {lat} 및 {lon}의 GET 쿼리 문자열에 전달하고 싶습니다. –

+0

코드가이를 수행하는 것 같습니다. 쿼리 문자열에 lat, lon을 넣지 않습니까? 그러면 나가는 요청의 쿼리 문자열은 무엇입니까? – Sangharsh

답변

0

나는 내 프로젝트에서 비슷한 일을했습니다. 나는 현재의 위도와 경도를 서버에 보내고 서버로부터 응답을 얻기 위해 개조를 사용했다. 여기에 샘플 코드가있다.

개조 인터페이스

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); 


} 

자바 코드는이 같은 일을하려고하는 경우 위도와 경도

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) { 

      } 
     }); 

전달에 응답을 얻을 도움 핑 날 필요로합니다.

1

감사합니다 당신은 개조 예에서 요청 매개 변수를 전달할 수 있습니다 : 당신이

www.example.com/yql?lat=123.11&lon=132.12 
+0

고마워요.하지만 이건 내가 찾고있는 것이 아니에요, 이걸 압니다. –