react-native网络请求

网络请求,使用的是第三方网络接口- 和风天气(有免费,也有商用的接口),大家可以去注册,登录一下,创建一个项目,会得到一个key,然后就可以免费使用了

和风天气-对应的文档:
https://dev.qweather.com/docs/api/weather/weather-daily-forecast/

测试一下接口--请求三天的天气预报

可以直接用浏览器来测试(写可以用postman软件来测试),

https://devapi.qweather.com/v7/weather/3d?location=116.41,39.92&key=ab016705d280420b8d72f5c6892901dc

结果如下:


image.png

转化为json格式

{
  "code": "200",
  "updateTime": "2021-11-15T16:35+08:00",
  "fxLink": "http://hfx.link/2ax1",
  "daily": [
    {
      "fxDate": "2021-11-15",
      "sunrise": "06:58",
      "sunset": "16:59",
      "moonrise": "15:16",
      "moonset": "03:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "12",
      "tempMin": "-1",
      "iconDay": "101",
      "textDay": "多云",
      "iconNight": "150",
      "textNight": "晴",
      "wind360Day": "45",
      "windDirDay": "东北风",
      "windScaleDay": "1-2",
      "windSpeedDay": "3",
      "wind360Night": "0",
      "windDirNight": "北风",
      "windScaleNight": "1-2",
      "windSpeedNight": "3",
      "humidity": "65",
      "precip": "0.0",
      "pressure": "1020",
      "vis": "25",
      "cloud": "4",
      "uvIndex": "3"
    },
    {
      "fxDate": "2021-11-16",
      "sunrise": "07:00",
      "sunset": "16:58",
      "moonrise": "15:38",
      "moonset": "04:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "13",
      "tempMin": "0",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "101",
      "textNight": "多云",
      "wind360Day": "225",
      "windDirDay": "西南风",
      "windScaleDay": "1-2",
      "windSpeedDay": "3",
      "wind360Night": "225",
      "windDirNight": "西南风",
      "windScaleNight": "1-2",
      "windSpeedNight": "3",
      "humidity": "74",
      "precip": "0.0",
      "pressure": "1016",
      "vis": "25",
      "cloud": "1",
      "uvIndex": "3"
    },
    {
      "fxDate": "2021-11-17",
      "sunrise": "07:01",
      "sunset": "16:57",
      "moonrise": "16:01",
      "moonset": "05:41",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "13",
      "tempMin": "0",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "150",
      "textNight": "晴",
      "wind360Day": "225",
      "windDirDay": "西南风",
      "windScaleDay": "1-2",
      "windSpeedDay": "3",
      "wind360Night": "225",
      "windDirNight": "西南风",
      "windScaleNight": "1-2",
      "windSpeedNight": "3",
      "humidity": "56",
      "precip": "0.0",
      "pressure": "1009",
      "vis": "25",
      "cloud": "0",
      "uvIndex": "3"
    }
  ],
  "refer": {
    "sources": [
      "QWeather",
      "NMC",
      "ECMWF"
    ],
    "license": [
      "QWeather Developers License"
    ]
  }
}

测试结果与文档一致,代表接口正常,下面我们就在代码进行请求

代码中请求接口

直接在代码中,用fetch请求
    const byFetch = () => {
        let appKey = "ab016705d280420b8d72f5c6892901dc"
        let cityLocation = "116.41,39.92"
        let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`

        fetch(url, {
            method: 'GET'
        })
            .then((response) => response.json())//response.json()返回是一个Promiss对象,才是我们需要的数据
            .then((data) => {
                console.log(data)
                Alert.alert('success', '请求成功')
            }).catch((error) => {
                Alert.alert('error', JSON.stringify(error))
            })
    }

需要注意的地方是fetch(url, { method: 'GET' })返回的response,并不是我们想要的,而是要将其转化为json,//response.json()返回是一个Promiss对象,才是我们需要的数据,所以后面可以接着.then()
结果如下

image.png

封装api,用fetch请求
  • 新建一个api.js文件
  • 封装一个方法,并导出getWeatherData
api.js文件代码
// 定义一个常量,存储appKey
const appKey = "ab016705d280420b8d72f5c6892901dc"

// 定义一个箭头函数,接收城市经纬度作为参数
export const getWeatherData = async (cityLocation) => {
    // 根据城市经纬度获取天气数据
    let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`
    try {
        // 使用await等待响应
        let response = await fetch(url, {
            method: 'GET'
        })
        // 使用await等待数据
        let data = await response.json()
        // 返回天气数据
        return data
    } catch (error) {
        // 处理错误
        console.error(error)
    }
}
  • 使用封装好的api来请求getWeatherData
        let cityLocation = "116.41,39.92"
        getWeatherData(cityLocation)
            .then((result) => {
                console.log(result)
                console.log(result.daily)

                Alert.alert('ByFetch 成功', '请求成功')
            }).catch((error) => {
                Alert.alert('error', JSON.stringify(error))
            })
image.png

这样我们就成功请求,并成功收到回复,收到数据

封装api,用axios请求
  • 安装axios插件,npm install axiosyarn add axios命令来安装Axios???/li>
  • ios中,需要去pod install,下载到本地
  • 在项目代码中,引入Axios模块import axios from 'axios'
  • 封装一个方法,并导出getWeatherDataByAxios
export const getWeatherDataByAxios = async (cityLocation) => {
    console.log("getWeatherDataByAxios------")
    // 根据城市经纬度获取天气数据
    let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`
    try {
        // 使用axios发送请求,并使用await等待数据

        let result = await axios.get(url)
        // 返回天气数据
        return result.data
    } catch (error) {
        // 处理错误
        console.error(error)
    }
}

需要注意的地方是,我们需要的数据在返回的result中的data中,所以看到代码中是这样返回的result.data

  • 使用封装好的api来请求getWeatherDataByAxios
       let cityLocation = "116.41,39.92"
        getWeatherDataByAxios(cityLocation)
            .then((result) => {
                console.log(result)
                console.log(result.daily)

                Alert.alert('getWeatherDataByAxios 成功', '请求成功')
            }).catch((error) => {
                Alert.alert('error', JSON.stringify(error))
            })
image.png

这样我们就成功请求,并成功收到回复,收到数据

api.js文件里面的完整代码如下

import axios from 'axios';
// 定义一个常量,存储appKey
const appKey = "ab016705d280420b8d72f5c6892901dc"

// 定义一个箭头函数,接收城市经纬度作为参数
export const getWeatherData = async (cityLocation) => {
    // 根据城市经纬度获取天气数据
    let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`
    try {
        // 使用await等待响应
        let response = await fetch(url, {
            method: 'GET'
        })
        // 使用await等待数据
        let data = await response.json()
        // 返回天气数据
        return data
    } catch (error) {
        // 处理错误
        console.error(error)
    }
}


// 定义一个箭头函数,接收城市经纬度作为参数
export const getWeatherDataByAxios = async (cityLocation) => {
    console.log("getWeatherDataByAxios------")
    // 根据城市经纬度获取天气数据
    let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`
    try {
        // 使用axios发送请求,并使用await等待数据

        let result = await axios.get(url)
        // 返回天气数据
        return result.data
    } catch (error) {
        // 处理错误
        console.error(error)
    }
}

测试文件home_screen.js里面的完整代码如下

//import liraries
import React, { Component } from 'react';
import { View, Text, StyleSheet, Button, Alert, axios } from 'react-native';
import MyLoading from './custom_component/loading'

import { getWeatherData, getWeatherDataByAxios } from './custom_component/api'
// create a component
const HomeScreen = ({ navigation }) => {


    goToDetailScreen = () => {
        navigation.navigate('Detail')
    }

    const byFetch = () => {

        let cityLocation = "116.41,39.92"
        getWeatherData(cityLocation)
            .then((result) => {
                console.log(result)
                console.log(result.daily)

                Alert.alert('ByFetch 成功', '请求成功')
            }).catch((error) => {
                Alert.alert('error', JSON.stringify(error))
            })



        // let appKey = "ab016705d280420b8d72f5c6892901dc"
        // let cityLocation = "116.41,39.92"
        // let url = `https://devapi.qweather.com/v7/weather/3d?location=${cityLocation}&key=${appKey}`

        // fetch(url, {
        //     method: 'GET'
        // })
        //     .then((response) => response.json())//response.json()返回是一个Promiss对象,才是我们需要的数据
        //     .then((data) => {
        //         console.log(data)
        //         Alert.alert('success', '请求成功')
        //     }).catch((error) => {
        //         Alert.alert('error', JSON.stringify(error))
        //     })
    }


    const byAxios = () => {

        let cityLocation = "116.41,39.92"
        getWeatherDataByAxios(cityLocation)
            .then((result) => {
                console.log(result)
                console.log(result.daily)

                Alert.alert('getWeatherDataByAxios 成功', '请求成功')
            }).catch((error) => {
                Alert.alert('error', JSON.stringify(error))
            })
    }

    return (
        <View style={styles.container}>
            <Text>HomeScreen</Text>
            <Button title='to detail screen' onPress={goToDetailScreen}></Button>
            <MyLoading title="请稍后。。。" onTap={() => {
                console.log("loading... tapped")
            }}></MyLoading>

            <Button title='to get weather data by axios' onPress={byAxios}></Button>
            <Button title='to get weather data by fetch' onPress={byFetch}></Button>

        </View>
    );
};

// define your styles
const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#f5f5f5',
    },
});

//make this component available to the app
export default HomeScreen;

结尾

今天RN 的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点个赞加关注吧~~ 后续分享更多有关RN Flutter和移动端原生开发相关的文章。欢迎在下面留言交流。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容