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

Android Studio调用Yelp API返回400验证错误问题求助

Yelp API 持续返回400 Validation Error 解决方案

问题根因

该报错和刷新API_KEY、修改BASE_URL无关,核心触发原因有两个:

  1. 未显式声明Accept: application/json请求头,Yelp Fusion API会对未声明接收JSON格式的请求直接返回参数校验错误
  2. 接口方法里手动传入Authorization头时,手动拼接Bearer 前缀很容易引入不可见空格、半角/全角空格错误,触发鉴权字段校验失败
    另外用Any作为响应泛型虽然不会直接触发400,但请求通了之后会出现JSON解析失败的问题,需要一并修正。

修复步骤

  • 给Retrofit配置自定义OkHttpClient,通过拦截器统一注入公共请求头、鉴权头,避免手动拼接参数出错
  • 移除接口方法里手动传Authorization头的参数,统一在拦截器处理
  • 替换响应泛型为自定义数据类,避免后续解析崩溃
  • 确认基础配置符合要求

修正后的代码

1. 调整Retrofit初始化逻辑(MainActivity.kt)

private const val TAG = "MainActivity"
private const val BASE_URL = "https://api.yelp.com/v3/"
// 注意复制API_KEY时不要带前后空格、换行
private const val API_KEY = "替换成你自己的有效API_KEY"

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 配置OkHttp客户端,统一处理请求头
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor { chain ->
                val original = chain.request()
                val request = original.newBuilder()
                    .addHeader("Accept", "application/json")
                    // 注意Bearer和API_KEY之间只有一个半角空格,不要加多余字符
                    .addHeader("Authorization", "Bearer $API_KEY")
                    .build()
                chain.proceed(request)
            }
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient) // 把配置好的客户端传入Retrofit
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        val yelpService = retrofit.create(YelpService::class.java)
        
        // 发起请求,移除手动传鉴权头的参数
        yelpService.searchRestaurants("Avocado Toast","New York").enqueue(object : Callback<YelpSearchResponse> {
            override fun onResponse(call: Call<YelpSearchResponse>, response: Response<YelpSearchResponse>) {
                if (response.isSuccessful) {
                    Log.i(TAG, "请求成功,匹配商户数:${response.body()?.total}")
                } else {
                    // 打印错误详情方便排查
                    Log.e(TAG, "请求异常,code:${response.code()},err:${response.errorBody()?.string()}")
                }
            }
            override fun onFailure(call: Call<YelpSearchResponse>, t: Throwable) {
                Log.e(TAG, "网络请求失败", t)
            }
        })
    }
}

// 简单的响应承接类,后续可以自行补全Business字段
data class YelpSearchResponse(
    val total: Int,
    val businesses: List<Any>
)

2. 调整YelpService接口定义

interface YelpService {
    @GET("businesses/search")
    fun searchRestaurants(
        @Query("term") searchTerm: String,
        @Query("location") location: String
    ) : Call<YelpSearchResponse>
}

配置校验点

改完代码如果还有问题,逐一核对以下配置:

  • 已经在build.gradle中引入正确的依赖:Retrofit、OkHttp、Gson转换器,版本适配当前项目的compileSdk
  • AndroidManifest.xml中已经声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • BASE_URL末尾保留斜杠,@GET注解里的路径不要加开头的/,否则Retrofit会丢弃baseUrl里的/v3/路径,导致请求地址错误
  • API_KEY复制自Yelp Fusion开发者后台,前后没有多余空格、换行符
  • 测试设备/模拟器网络正常,可以正常访问Yelp API服务

内容的提问来源于stack exchange,提问作者Selahattin Ünlü

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:51:17