Android Retrofit 2获取WordsAPI同义词无名字符串列表技术问询
解决Retrofit 2调用WordsAPI同义词接口的问题
嘿,我来帮你搞定这个Retrofit调用的问题!针对WordsAPI返回的特殊JSON结构,咱们一步步来实现:
1. 先添加必要的依赖
首先确保你的build.gradle(Module level)里已经添加了Retrofit和Gson转换器的依赖:
dependencies { // Retrofit核心库 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Gson转换器,用于解析JSON implementation 'com.squareup.retrofit2:converter-gson:2.9.0' }
记得同步一下Gradle哦。
2. 创建对应JSON结构的实体类
因为接口返回的JSON是包含word字段和synonyms数组的对象,咱们需要创建一个实体类来映射这个结构,命名为SynonymsResponse就行:
public class SynonymsResponse { private String word; private List<String> synonyms; // 生成getter方法(Retrofit需要通过getter来获取数据) public String getWord() { return word; } public List<String> getSynonyms() { return synonyms; } }
如果用Kotlin的话,会更简洁:
data class SynonymsResponse( val word: String, val synonyms: List<String> )
3. 定义Retrofit的API接口
接下来创建一个接口,用来描述咱们的API请求。注意这里的mashape-key是作为Query参数传递的,接口地址里的go是动态的单词,所以咱们把它设为路径参数:
import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; import retrofit2.http.Query; public interface WordsApiService { // 路径参数{word}用来替换URL里的具体单词,比如"go" // Query参数"mashape-key"传递你的API密钥 @GET("words/{word}/synonyms") Call<SynonymsResponse> getSynonyms( @Path("word") String word, @Query("mashape-key") String apiKey ); }
这样就不用把密钥硬编码在URL里,更灵活也更安全。
4. 初始化Retrofit并发起请求
最后一步就是初始化Retrofit实例,调用接口获取同义词列表了:
// 初始化Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://wordsapiv1.p.mashape.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); // 创建API服务实例 WordsApiService apiService = retrofit.create(WordsApiService.class); // 发起请求,这里替换成你的实际API密钥 Call<SynonymsResponse> call = apiService.getSynonyms("go", "你的mashape-key"); // 异步执行请求 call.enqueue(new Callback<SynonymsResponse>() { @Override public void onResponse(Call<SynonymsResponse> call, Response<SynonymsResponse> response) { if (response.isSuccessful() && response.body() != null) { // 获取同义词列表 List<String> synonyms = response.body().getSynonyms(); // 这里就可以处理同义词数据啦,比如打印或者展示到UI上 for (String synonym : synonyms) { Log.d("Synonyms", synonym); } } else { // 处理请求失败的情况,比如打印错误信息 Log.e("Error", "请求失败: " + response.message()); } } @Override public void onFailure(Call<SynonymsResponse> call, Throwable t) { // 处理网络失败的情况 Log.e("Network Error", t.getMessage()); } });
如果是Kotlin的协程版本,会更简洁:
// 初始化Retrofit val retrofit = Retrofit.Builder() .baseUrl("https://wordsapiv1.p.mashape.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val apiService = retrofit.create(WordsApiService::class.java) // 在协程中发起请求 CoroutineScope(Dispatchers.IO).launch { try { val response = apiService.getSynonyms("go", "你的mashape-key") if (response.isSuccessful && response.body() != null) { val synonyms = response.body()!!.synonyms // 切换到主线程更新UI withContext(Dispatchers.Main) { // 处理同义词数据 } } } catch (e: Exception) { e.printStackTrace() } }
最后别忘了在AndroidManifest.xml里添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
这样一套流程下来,你就能顺利获取到同义词的字符串列表啦!如果遇到问题,先检查API密钥是否正确,或者网络连接是否正常。
内容的提问来源于stack exchange,提问作者Thuan Vo
相关产品推荐
相关产品推荐

