如何在Android中集成Yelp V3 Search API?求实现示例
没问题,我来帮你搞定Android上Yelp V3 Search API的集成!针对你提到的V2停用问题,V3的集成核心是更换认证方式和请求结构,下面是详细的步骤和示例代码:
在Android中集成Yelp V3 Search API指南
一、前期准备
- 首先前往Yelp开发者平台申请你的V3 API Key,这是请求必须的身份凭证,没有它请求会被拒绝。
- 确保你的Android项目已添加网络权限,在
AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />
二、使用OkHttp实现基础请求(简单直接)
如果不想引入复杂框架,OkHttp是轻量且易用的选择,以下是调用示例:
1. 添加OkHttp依赖
在模块级build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
2. 编写请求代码
import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class YelpApiHelper { private static final String YELP_API_KEY = "你的API Key"; private static final String BASE_URL = "https://api.yelp.com/v3/businesses/search"; public void searchDelis(double latitude, double longitude) { OkHttpClient client = new OkHttpClient(); // 拼接请求URL和参数 String url = String.format("%s?term=delis&latitude=%f&longitude=%f", BASE_URL, latitude, longitude); Request request = new Request.Builder() .url(url) .addHeader("Authorization", "Bearer " + YELP_API_KEY) // V3核心:Bearer认证 .build(); // 异步请求,避免主线程阻塞 client.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { e.printStackTrace(); // 处理请求失败,比如给用户提示 } @Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { String jsonResponse = response.body().string(); // 解析JSON数据,建议用Gson等库 // 注意:更新UI需切换回主线程 runOnUiThread(() -> { // 在这里处理解析后的数据,展示到UI上 }); } else { // 处理非200的响应,比如打印错误信息 System.out.println("请求失败,状态码:" + response.code()); } } }); } // 辅助方法:切换到主线程(如果是在Activity中可以直接用runOnUiThread,这里示例封装) private void runOnUiThread(Runnable runnable) { // 如果是在Fragment或ViewModel中,需用对应的主线程调度方式 // 示例:((Activity) context).runOnUiThread(runnable); } }
三、使用Retrofit实现(结构化方案)
如果项目已经使用Retrofit,这种方式更优雅且易于维护:
1. 添加Retrofit和Gson依赖
在模块级build.gradle中添加:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
2. 定义API接口和实体类
import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Header; import retrofit2.http.Query; import java.util.List; // API接口定义 public interface YelpApiService { @GET("businesses/search") Call<YelpSearchResponse> searchBusinesses( @Header("Authorization") String authHeader, @Query("term") String term, @Query("latitude") double latitude, @Query("longitude") double longitude ); } // 对应Yelp返回的JSON结构的实体类(按需添加字段) public class YelpSearchResponse { private List<Business> businesses; // Getter和Setter public List<Business> getBusinesses() { return businesses; } public void setBusinesses(List<Business> businesses) { this.businesses = businesses; } public static class Business { private String id; private String name; private String image_url; private double rating; // Getter和Setter public String getName() { return name; } public void setName(String name) { this.name = name; } // 其他字段的Getter/Setter按需添加 } }
3. 初始化Retrofit并发起请求
import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class YelpRetrofitHelper { private static final String YELP_API_KEY = "你的API Key"; private static final String BASE_URL = "https://api.yelp.com/v3/"; public void searchDelis(double latitude, double longitude) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); YelpApiService service = retrofit.create(YelpApiService.class); Call<YelpSearchResponse> call = service.searchBusinesses( "Bearer " + YELP_API_KEY, "delis", latitude, longitude ); call.enqueue(new retrofit2.Callback<YelpSearchResponse>() { @Override public void onResponse(Call<YelpSearchResponse> call, retrofit2.Response<YelpSearchResponse> response) { if (response.isSuccessful()) { YelpSearchResponse searchResponse = response.body(); if (searchResponse != null && searchResponse.getBusinesses() != null) { // 处理商家列表数据,更新UI runOnUiThread(() -> { // 比如将数据设置到RecyclerView的Adapter中 }); } } else { System.out.println("请求失败,状态码:" + response.code()); } } @Override public void onFailure(Call<YelpSearchResponse> call, Throwable t) { t.printStackTrace(); // 处理网络失败 } }); } // 同样,这里的runOnUiThread需要根据上下文实现 private void runOnUiThread(Runnable runnable) { // 示例:((Activity) context).runOnUiThread(runnable); } }
四、关键注意事项
- 认证方式:Yelp V3必须使用
Bearer Token认证,请求头格式为Authorization: Bearer 你的API Key,这和V2直接传API Key作为参数的方式完全不同,一定要注意! - 线程问题:Android禁止在主线程执行网络请求,所以必须使用异步请求(上述示例均为异步),否则会抛出
NetworkOnMainThreadException。 - 数据解析:Yelp返回的JSON结构较复杂,建议用Gson或Moshi自动解析,手动解析容易出错。
- 调用限制:注意Yelp API的调用频率配额,避免超过限制导致请求被限流。
内容的提问来源于stack exchange,提问作者Vijendra patidar
相关产品推荐
相关产品推荐

