You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:16:04