当前位置: 首页 > 知识库问答 >
问题:

改进动态URL问题

裴星洲
2023-03-14

我是Retrofit 2的新手,正在尝试在我的应用程序中集成Google Place API。我的问题是如何在使用Retrofit 2.0的同时使用这种动态URL。

URL:

  https://maps.googleapis.com/maps/api/place/autocomplete/json?input="{Place Name}"&location="{Lat,long}"&key="{API KEY}"

我的模型类名称为:

1)位置自动完成

位置预测

public class PlaceAutoComplete {

private String place_id;
private String description;

public String getPlaceDesc() {
    return description;
}

public void setPlaceDesc(String placeDesc) {
    description = placeDesc;
}

public String getPlaceID() {
    return place_id;
}

public void setPlaceID(String placeID) {
    place_id = placeID;
}

}

以及

public class PlacePredictions {

  public ArrayList<PlaceAutoComplete> getPlaces() {
    return predictions;
}

  public void setPlaces(ArrayList<PlaceAutoComplete> places) {
    this.predictions = places;
}

  private ArrayList<PlaceAutoComplete> predictions;
}

我已经创建了WebServiceCall。java类进行改造,这是我的代码

public class WebServiceCall {
private static WebServiceCall webServiceCall;
public RetrofitService retrofitService;
private String currentDateTimeString;

public WebServiceCall() {
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
    if (Boolean.parseBoolean("true")) {
        HttpLoggingInterceptor httpLoggingInterceptor = new   HttpLoggingInterceptor();            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        clientBuilder.connectTimeout(100000, TimeUnit.MILLISECONDS);
        clientBuilder.addInterceptor(httpLoggingInterceptor);
    }



    retrofitService = new Retrofit.Builder()
                .baseUrl("https://maps.googleapis.com/maps/api/place/autocomplete/json")
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(RetrofitService.class);
    currentDateTimeString =      DateFormat.getDateTimeInstance().format(new Date());
}

public static WebServiceCall getInstance() {
    if (webServiceCall == null) {
        webServiceCall = new WebServiceCall();
    }
    return webServiceCall;
}
}  

我在调用URL时使用了这个接口:但我无法继续。

 public interface RetrofitService {

@GET("?input=")
Call<PlaceAutoComplete> getInput(@Url String url);

}

我一直在谷歌和StackOverflow中搜索,但没有让我明白。详细的解释将是非常值得赞赏的。

非常感谢。

共有2个答案

冯淳
2023-03-14

在您的界面中

@获取调用加载配置文件(@Url字符串Url);

从调用服务器的位置添加此函数。

  public void loadServerData() {
    ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
    Call<PojoClass> call = apiInterface.loadProfile("https://maps.googleapis.com/maps/api/place/autocomplete/json?input="{Place Name}"&location="{Lat,long}"&key="{API KEY}"");
    call.enqueue(new Callback<PojoClass>() {
        @Override
        public void onResponse(Call<PojoClass> call, Response<PojoClass> response) {
            updateUI();
        }

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

        }
    });
}

和APIClient类

public class ApiClient {

private static final String Base_URL = Constants.URL.BASE_URL;
private static Retrofit retrofit = null;
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();


private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(Base_URL)
                .addConverterFactory(GsonConverterFactory.create());


public static Retrofit getClient() {
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(Base_URL)
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()))
                .build();
    }
    return retrofit;
}


public static <S> S createService(Class<S> serviceClass) {
    return createService(serviceClass, null);
}

public static <S> S createService(Class<S> serviceClass, final RequestBody body) {
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            Request original = chain.request();

            Request.Builder requestBuilder = original.newBuilder()
                    .header("Accept", "application/json")
                    .method(original.method(), body);

            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });
    OkHttpClient client = httpClient.build();
    Retrofit retrofit = builder.client(client).build();
    return retrofit.create(serviceClass);
}

}

程招
2023-03-14

改装1:

@GET("/place/autocomplete/json")
void getDetails(
             @Query("input") String input,
             @Query("location") String location, 
             @Query("key") String key,
             Callback<Response> callback);

如果参数未知,应创建如下参数:

@GET("/place/autocomplete/json")
@FormUrlEncoded
void getDetails(
              @FieldMap Map<String, String> params,
              Callback<Response> callback);

改装2

    @GET("place/autocomplete/json")
    Call<List<Response>> getDetails(
                            @Query("input") String input,
                            @Query("location") String location, 
                            @Query("key") String key);

对于未知参数:

  @GET("place/autocomplete/json")
  Call<List<Response>> getDetails(
                             @QueryMap Map<String, String> options);

您应该按照以下方式进行设置,即在基本URL的末尾/尾随:

retrofitService = new Retrofit.Builder() 
            .baseUrl("https://maps.googleapis.com/maps/api/")
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build()

你为什么要这么做?您可以在此处找到:https://stackoverflow.com/a/32356916/3863689

 类似资料:
  • 我想要这样的url baseURL/dealer/index.php?r=rest/packinfo 我开始犯错了 URL查询字符串“r=rest/{method}”不能有replace block。对于动态查询参数,请使用@query。

  • 运行已经做好的博客框架, 会发现一个问题, 只有一个主页的空盒子, 而大部分时候我们希望能够让每篇博客文章都有一个独立的页面. 我第一个想到的方法是给每篇博客文章加一个view函数逻辑, 然后设置一个独立的url(我不知道语言比如PHP, 或者web框架rail等是如果解决的, 我是第一次仔细的学习web框架, 也没有前端开发经验), 但是这种方法耦合性太强, 而且用户不友好, 缺点非常多 Dja

  • 本文向大家介绍JS来动态的修改url实现对url的增删查改,包括了JS来动态的修改url实现对url的增删查改的使用技巧和注意事项,需要的朋友参考一下 虽然可以通过get方式提交post表单等方式来动态修改url,但如果多个按钮能并行提交时,写多个大体相同,又有些细节差异的表单,难免有些不妥,因此,想到了通过JS来动态的修改url,来实现对url的增删查改。

  • 其实相对于VIP的切换,动态修改持久化则是比较常见的一个需求,一般在一主多从多Sentinel的HA环境中,为了性能常常在Master上关闭持久化,而在Slave上开启持久化,但是如果发生切换就必须有人工干预才能实现这个功能。可以利用client-reconfig-script自动化该进程,无需人工守护,我们就以RDB的动态控制为例: Sentinel配置文件如下: sentinel client

  • 本文向大家介绍JS动态修改图片的URL(src)的方法,包括了JS动态修改图片的URL(src)的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS动态修改图片的URL(src)的方法。分享给大家供大家参考。具体如下: 下面的JS代码可以动态修改图片地址,以显示一张新的图片,实际上是通过修改图片的src属性来实现的 希望本文所述对大家的javascript程序设计有所帮助。

  • 我正在工作的一个项目,允许人们列出手机出售,并能够查看所有的手机出售。我的工作正常。jsp返回一个包含所有电话及其所有详细信息的列表。如品牌、型号、网络、存储、颜色、屏幕大小等。 问题是,它需要设置,以便您只看到“品牌”和“型号”(例如“i Phone”“6”),然后能够点击“更多信息”查看其余的细节。这个'more info'按钮应该会打开一个包含手机全部细节的新jsp。 抱歉,如果我没有提供足