许多(并非全部)移动应用程序充当客户端,用于查看远程数据,这些数据通常会出现在 Web 应用程序中。使用 HTTP 请求来与远程 Web 服务或 RESTful API 通信是消费和传输数据的最常见方式。
如果您一直关注我的 Vue.js 内容,您会记得我写过一篇名为 在 Vue.js Web 应用程序中通过 HTTP 使用远程 API 数据 的教程。在该教程中,Web 浏览器充当客户端,我们使用 axios 和 vue-resource 来发出 HTTP 请求。
在本教程中,我们将了解如何在使用 Vue.js JavaScript 框架构建的 NativeScript 应用程序 中发出 HTTP 请求。
请记住,NativeScript 将创建原生 Android 和 iOS 应用程序。但是,与我 之前教程 中演示的发出 HTTP 请求的 Web 方法仍然有效。也就是说,我们将研究 NativeScript 的工作方式并重新审视其他方法。
为简单起见,我们将在一个新的项目中发出简单的 HTTP 请求。这将帮助我们排除任何现有且可能不正确的项目代码。假设您已安装 Vue CLI 和 NativeScript CLI,请执行以下操作
vue init nativescript-vue/vue-cli-template http-project
cd http-project
npm install
npm run watch:ios
上面的命令将使用 NativeScript 模板创建一个名为http-project的新项目,该项目使用 Vue CLI。它们将安装 NativeScript 和 Vue.js 依赖项,然后它们将通过 iOS 模拟器启动应用程序模拟,并进行热重载。如果您无法访问 iOS 模拟器,可以使用 Android。
创建新项目时,系统会询问您一些有关应用程序设置的问题。对于此特定示例,默认设置就可以了。
在我们深入代码之前,我想指出我们将使用开放且免费的 API 来获取 Pokéapi 上的宝可梦数据。您可以使用任何 API 或您自己创建的 API。如果您想自己构建 API,请查看我写的一篇名为 使用 Node.js 和 Hapi 框架构建 RESTful API 的教程。
我们将探索的第一种方法(也可能是开发 NativeScript 应用程序时推荐的方法)使用 NativeScript HTTP 模块。打开项目的src/components/HelloWorld.vue文件,并包含以下内容以开始
<template>
<Page class="page">
<ActionBar class="action-bar" title="Pokemon"></ActionBar>
<GridLayout>
<ListView for="p in pokemon" class="list-group">
<v-template>
<StackLayout class="list-group-item">
<Label :text="p.name" />
</StackLayout>
</v-template>
</ListView>
</GridLayout>
</Page>
</template>
<script>
import * as http from "http";
export default {
data() {
return {
pokemon: []
};
},
mounted() { }
};
</script>
<style scoped></style>
上面的代码或多或少是我们试图完成的事情的设置。在<script>
块中,我们初始化了一个名为pokemon
的数组,它将保存我们所有 HTTP 响应数据。我们还导入了与 NativeScript 项目捆绑在一起的http
模块。
在<template>
块中,我们有一个<ListView>
,它根据pokemon
数组的内容进行填充。如果我们现在运行应用程序,它将不显示任何内容,因为该数组为空。
现在假设我们要在应用程序加载时获取宝可梦列表。在mounted
方法中,我们可以执行以下操作
http.getJSON("https://pokeapi.co/api/v2/pokemon/?limit=151").then(result => {
this.pokemon = result.results;
}, error => {
console.log(error);
});
上面的getJSON
方法将使用 Pokéapi 获取前 151 只宝可梦的列表。结果将被设置为我们的pokemon
数组,并将在我们的列表中渲染。
虽然对本示例没有用,但如果我们想通过 POST 请求发送数据,我们可以执行以下操作
http.request({
url: "https://httpbin.org/post",
method: "POST",
headers: { "Content-Type": "application/json" },
content: JSON.stringify({
username: "username",
password: "password"
})
}).then(response => {
var result = response.content.toJSON();
}, error => {
console.error(error);
});
以上内容摘自 http 模块文档。请记住,Pokéapi 仅供消费,您不应该向其发送数据。
现在我们已经了解了如何使用 NativeScript HTTP 模块与远程 Web 服务交互,让我们看一下如何使用更广为人知的 axios 方法,我在我 之前的教程 中演示过它。
首先,我们需要为我们的项目获取 axios 库
npm install axios --save
下载完库后,现在我们可以在项目中使用它。我们创建的大部分内容都可以保留,我们只需要删除添加的 NativeScript HTTP 内容即可。
打开项目的src/components/HelloWorld.vue文件,使<script>
块看起来像以下内容
<script>
import axios from "axios";
export default {
data() {
return {
pokemon: []
};
},
mounted() {
axios({ method: "GET", "url": "https://pokeapi.co/api/v2/pokemon/?limit=151" }).then(result => {
this.pokemon = result.data.results;
}, error => {
console.error(error);
});
}
};
</script>
在我们的 Vue.js 与 NativeScript 项目中使用 axios 库并不难。它甚至可能拥有更多文档,因为它是一个使用广泛的库。与 NativeScript HTTP 模块一样,它提供了除 GET 请求以外的请求。只需查看 官方文档 即可。
您刚刚了解了如何在使用 Vue.js 的 NativeScript-Vue Android 和 iOS 应用程序中向流行的远程 API 发出 HTTP 请求。完成此任务有很多方法,但我认为 NativeScript HTTP 模块是推荐的方法,因为它专为原生 Android 和 iOS 功能而设计。