Android Studio调用Yelp API返回400验证错误问题求助
Yelp API 持续返回400 Validation Error 解决方案
问题根因
该报错和刷新API_KEY、修改BASE_URL无关,核心触发原因有两个:
- 未显式声明
Accept: application/json请求头,Yelp Fusion API会对未声明接收JSON格式的请求直接返回参数校验错误 - 接口方法里手动传入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ü
相关产品推荐
相关产品推荐

