2014-06-07 19 views
49

kullanarak GET. Servis arayüzü aşağıdaki gibidir:Güçlendirme ve ben Sonradan montaj kullanarak Google Geocode API istek gönderme çalışıyorum parametreleri

public interface FooService {  
    @GET("/maps/api/geocode/json?address={zipcode}&sensor=false") 
    void getPositionByZip(@Path("zipcode") int zipcode, Callback<String> cb); 
} 

Ben servisini aradığında:

06-07 13:18:55.337: E/AndroidRuntime(3756): FATAL EXCEPTION: Retrofit-Idle 
06-07 13:18:55.337: E/AndroidRuntime(3756): Process: com.marketplacehomes, PID: 3756 
06-07 13:18:55.337: E/AndroidRuntime(3756): java.lang.IllegalArgumentException: FooService.getPositionByZip: URL query string "address={zipcode}&sensor=false" must not have replace block. 
06-07 13:18:55.337: E/AndroidRuntime(3756):  at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:120) 
06-07 13:18:55.337: E/AndroidRuntime(3756):  at retrofit.RestMethodInfo.parsePath(RestMethodInfo.java:216) 
06-07 13:18:55.337: E/AndroidRuntime(3756):  at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:162) 
06-07 13:18:55.337: E/AndroidRuntime(3756):  at 

Ben bir StackOverflow soru bir göz attım: Aşağıdaki stacktrace almak

OkHttpClient okHttpClient = new OkHttpClient(); 

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Constants.GOOGLE_GEOCODE_URL).setClient(new OkClient(okHttpClient)).build(); 

FooService service = restAdapter.create(FooService.class); 

service.getPositionByZip(zipCode, new Callback<String>() { 
    @Override public void success(String jsonResponse, Response response) { 
     ... 
    } 
@Override public void failure(RetrofitError retrofitError) { 
    } 
}); 

Retrofit: multiple query parameters in @GET command? ama uygulanabilir görünmüyordu.

buradan hemen hemen kelimesi kelimesine kod aldı: http://square.github.io/retrofit/ yüzden bir kayıp biraz sorunu anlamak için duyuyorum.

Düşünceler?

cevap

95

AFAIK, {...} sadece bir sorgu param içinde, bir yol olarak kullanılabilir. Bunun yerine bu deneyin:

public interface FooService {  

    @GET("/maps/api/geocode/json?sensor=false") 
    void getPositionByZip(@Query("address") String address, Callback<String> cb); 
} 

Eğer parametrelerin bilinmeyen bir miktar varsa

geçmek için de, böyle bir şey yapmak kullanabilirsiniz:

public interface FooService {  

    @GET("/maps/api/geocode/json") 
    @FormUrlEncoded 
    void getPositionByZip(@FieldMap Map<String, String> params, Callback<String> cb); 
} 
+0

Teşekkür olacak denilen URL öyleydi. –

+0

Birden fazla Query params eklemek nasıl eklenir –

+1

@GilbertoIbarra err, daha fazla ekleyerek: 'void getPositionByZip (@Query (" address ") Dize adresi, @Query (" sayı ") Dize numarası, Geri arama cb); –

22

@QueryMap Eğer FieldMap

yerine benim için çalıştı GET params bir grup var, senin url içine geçmesi için başka bir yol, bir HashMap olduğunu.

class YourActivity extends Activity { 

private static final String BASEPATH = "http://www.example.com"; 

private interface API { 
    @GET("/thing") 
    void getMyThing(@QueryMap Map<String, String> params, new Callback<String> callback); 
} 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 

    RestAdapter rest = new RestAdapter.Builder().setEndpoint(BASEPATH).build(); 
    API service = rest.create(API.class); 

    Map<String, String> params = new HashMap<String, String>(); 
    params.put("key1", "val1"); 
    params.put("key2", "val2"); 
    // ... as much as you need. 

    service.getMyThing(params, new Callback<String>() { 
     // ... do some stuff here. 
    }); 
} 
} 

http://www.example.com/thing/?key1=val1&key2=val2

İlgili konular