如何从Android的API中获取数据
API允许应用程序访问大量的数据。在许多情况下,开发人员通常将他们的软件与第三方API连接起来。此举使他们能够节省大量的时间。在Android中,Volley和Retrofit等工具允许你无缝连接到API。
简介
安卓是世界上最流行的操作系统之一。来自谷歌的统计数据显示,有超过10亿的设备在运行安卓系统。因此,在我们的应用程序中利用API的能力有助于我们满足许多用户的需求。
在使用API时,我们应该考虑的一个主要因素是请求的数量。我们应该避免进行过多的网络操作。因为这可能会增加电池的消耗,导致用户满意度低。此外,API所有者可以禁止提出过多请求的应用程序。
目标
本教程提供了一个指南,说明如何根据用户的操作来发出API请求。我们将制作一个简单的搜索应用,向OMDB电影API发送请求并接收数据。
前提条件
要理解本教程,你必须有Kotlin的基本知识。此外,你需要在你的电脑上安装Android Studio。
第1步 - 开始学习
启动Android Studio并创建一个新的项目,其中有一个空的活动,如下图所示。

给项目起个名字,然后点击finish 按钮。请注意,项目的创建通常需要一些相当长的时间。因此,你需要有耐心。
第2步 - 安装依赖项
下一步是安装volley和glide的依赖项。我们将使用volley来处理网络请求,而glide将帮助在应用程序中加载图像。
在app级别的build.gradle 文件中添加以下几行。
Dependencies{
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
然后你点击Sync Now 按钮,下载并在应用程序中纳入上述依赖。
第3步 - 审查电影API
在本教程中,我们将从OMDbAPI发送和接收数据。在进一步研究之前,必须了解如何访问数据、网站规则和数据结构。
数据访问
为了访问数据,我们需要在OMDb网站上创建一个账户。这个过程需要一个有效的电子邮件。请注意,本教程使用的是免费账户选项,每天有1000个请求的限制。
注册后,一个API密钥会被发送到你的邮箱中。
网站规则
在向OMDb API提出请求时,需要包含一个API密钥。例如,正确的链接如下所示。
val url = "http://www.omdbapi.com/?t=${input}&apikey=${your_key}"
这个输入变量将允许我们在OMDb API中搜索不同的电影。密钥通常被放在url的末尾。
第4步 - 布局设计
该应用程序将有一个简单的布局,如下图所示。

我们将使用LinearLayout 来安排屏幕上的不同组件。请注意,布局的方向被设置为垂直。下面是activity-main.xml 的代码。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/userinput"
android:layout_margin="10dp"
android:padding="17dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Search"
android:backgroundTint="@color/colorAccent"/>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/name"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/plot"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
在上面的布局中,我们已经为我们的组件分配了一个ID。我们将在MainActivity.kt 文件中使用这些唯一的值。
EditText 小组件允许我们获得用户的输入。当点击时,搜索按钮将启动对OMDb API的请求。ImageView 和TextViews 将显示从服务器返回的数据。
第5步 - 连接到API
本教程展示了如何进行简单的API请求。因此,我们所有的逻辑都在MainActivity 文件中,而不是在一个单独的组件中,如ViewModel 。
我们需要在MainActivity 中做以下事情。
- 发起一个
requestQueue。 - 提出一个API请求。
- 解析数据到UI组件。
一个RequestQueue ,帮助我们管理HTTP请求。
我们通过在设置一个内容视图后立即添加以下几行来启动一个requestQueue 。
setContentView(R.layout.activity_main)
val appnetwork = BasicNetwork(HurlStack())
val appcache = DiskBasedCache(cacheDir, 1024 * 1024) // 1MB cap
requestQueue = RequestQueue(appcache, appnetwork).apply {
start()
}
appnetwork 这个变量允许应用程序使用一个HTTP客户端。
下一步是为我们的search 按钮添加一个点击监听器。用户将通过点击这个按钮进行API调用。
search.setOnClickListener {
var input = userinput.text.toString()
fetchData(input)
}
输入变量存储用户的搜索词。这个值将作为一个参数传递给fetchData 方法。让我们来创建fetchData 方法。
fun fetchData( input: String){
val url = "http://www.omdbapi.com/?t=${input}&apikey=cebd9b53"
val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
{ response ->
if(response.get("Response")=="False"){
name.text = "Incorrect detail"
}else {
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
}
},
{ error ->
Log.d("vol",error.toString())
}
)
requestQueue.add(jsonObjectRequest)
}
fetchData 函数需要一个字符串(用户的输入)作为参数。这个字符串然后被加入到url中,作为=${input} 。我们使用JsonObjectRequest ,因为我们的应用程序返回一个单一的电影对象,而不是一个列表。我们使用一个if-else 语句来处理jsonObjectRequest lambda函数中的不同状态。如果请求成功,我们提取数据并将其解析为组件。
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
Glide库帮助加载图片到ImageView 。
在网络请求失败的情况下,也会记录一个错误信息。这有助于调试过程。
{ error ->
Log.d("vol",error.toString())
}
最后,jsonObjectRequest 被添加到requestQueue 。
requestQueue.add(jsonObjectRequest)
下面是MainActivity.kt 的代码。
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.BasicNetwork
import com.android.volley.toolbox.DiskBasedCache
import com.android.volley.toolbox.HurlStack
import com.android.volley.toolbox.JsonObjectRequest
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
lateinit var requestQueue: RequestQueue
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appnetwork = BasicNetwork(HurlStack())
val appcache = DiskBasedCache(cacheDir, 1024 * 1024) // 1MB cap
requestQueue = RequestQueue(appcache, appnetwork).apply {
start()
}
search.setOnClickListener {
var input = userinput.text.toString()
fetchData(input)
}
}
fun fetchData( input: String){
val url = "http://www.omdbapi.com/?t=${input}&apikey=cebd9b53"
val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
{ response ->
if(response.get("Response")=="False"){
name.text = "Incorrect detail"
}else {
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
}
},
{ error ->
Log.d("vol",error.toString())
}
)
requestQueue.add(jsonObjectRequest)
}
}
请注意,在测试该应用程序之前,我们需要授予它对互联网的访问权。我们还应该允许该应用程序使用明文流量。这一步是必不可少的,尤其是在API源没有SSL证书的情况下。
要允许这些权限,请打开清单文件。在package="your-package-name"> 之后立即添加以下语句。
<uses-permission android:name="android.permission.INTERNET"/>
在同一文件中,滚动到应用程序部分并添加android:usesCleartextTraffic="true" 。
现在我们可以在我们的手机上编译和运行该应用程序了。

总结
从上面的教程中,我们已经学到了。
- 如何审查API。
- 如何修改Url。
- 如何进行API请求。
因此,你可以利用这些知识来开发更复杂的应用程序。