如何从安卓的API中获取数据

513 阅读5分钟

如何从Android的API中获取数据

API允许应用程序访问大量的数据。在许多情况下,开发人员通常将他们的软件与第三方API连接起来。此举使他们能够节省大量的时间。在Android中,Volley和Retrofit等工具允许你无缝连接到API。

简介

安卓是世界上最流行的操作系统之一。来自谷歌的统计数据显示,有超过10亿的设备在运行安卓系统。因此,在我们的应用程序中利用API的能力有助于我们满足许多用户的需求。

在使用API时,我们应该考虑的一个主要因素是请求的数量。我们应该避免进行过多的网络操作。因为这可能会增加电池的消耗,导致用户满意度低。此外,API所有者可以禁止提出过多请求的应用程序。

目标

本教程提供了一个指南,说明如何根据用户的操作来发出API请求。我们将制作一个简单的搜索应用,向OMDB电影API发送请求并接收数据。

前提条件

要理解本教程,你必须有Kotlin的基本知识。此外,你需要在你的电脑上安装Android Studio。

第1步 - 开始学习

启动Android Studio并创建一个新的项目,其中有一个空的活动,如下图所示。

New Project

给项目起个名字,然后点击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步 - 布局设计

该应用程序将有一个简单的布局,如下图所示。

App Layout

我们将使用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的请求。ImageViewTextViews 将显示从服务器返回的数据。

第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"

现在我们可以在我们的手机上编译和运行该应用程序了。

App Gif

总结

从上面的教程中,我们已经学到了。

  • 如何审查API。
  • 如何修改Url。
  • 如何进行API请求。

因此,你可以利用这些知识来开发更复杂的应用程序。