鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面

news2025/5/25 2:10:46

发请求展示新闻列表

鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面

1. 效果图

新闻首页:

image-20241228110957844

点击某一新闻的详情页面(需要使用模拟器才能查看详情页面):

image-20241228111016248

2. 代码

1. key准备

首先需求到聚合网申请一个key,网址如下:

聚合数据-个人中心

本文使用的接口API地址如下:

新闻API接口_今日头条新闻API接口_免费API数据接口_聚合数据 - 天聚地合

image-20241228111431234

申请完毕后是这样的:

image-20241228111345915

会有一个唯一的AppKey,这个就是我们代码中需要用到的

注意:该新闻接口虽然是免费的,但每天我们只能调用50次,你想用更多次数的话,就只能充值了

2. 新闻列表

新闻列表代码如下:

import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction, router } from '@kit.ArkUI';

interface NewsResult {
  reason: string
  result: ResultJson
  error_code: number
}

interface ResultJson {
  stat: string
  data: Array<ResultData>
  page: string
  pageSize: string
}

interface ResultData {
  uniquekey: string
  title: string
  date: string
  category: string
  author_name: string
  url: string
  thumbnail_pic_s: string
  is_content: string
}

/**
 * Author: 波波老师(weixin:javabobo0513)
 * Desc: 展示实时新闻数据列表
 */
@Entry
@Component
struct NewsPage {
  @State page: number = 1; //当前页数, 最大50
  @State newsType: string = 'top'; //新闻类型
  //新闻数据结果
  @State newsResult: NewsResult | null = null;
  //新闻数据集合
  @State dataList: Array<ResultData> = [];
  //调用聚合网API接口的key(换成自己申请的key即可)
  @State keyString: string = 'xxxxxxxxxxxxxx';
  @State isRefreshing: boolean = false; //刷新标识

  aboutToAppear(): void {
    this.loadData();
  }

  //调用第三方接口获取实时新闻数据
  loadData() {
    //请求页数处理
    if (this.page < 50) {
      this.page++
    } else {
      this.page = 1
    }
    let url: string =
      `http://v.juhe.cn/toutiao/index?key=${this.keyString}&type=${this.newsType}&page=${this.page}&page_size=20&is_filter=1`;
    MyTools.getNewsData(url).then((res: NewsResult) => {
      this.isRefreshing = false; //关闭下拉刷新效果
      //打印请求结果
      console.log('news = res======:', JSON.stringify(res))
      this.newsResult = res;
      if (this.newsResult?.error_code == 0) {
        this.dataList = this.newsResult.result.data;
      } else {
        promptAction.showToast({ message: this.newsResult?.reason as string })
      }
    }).catch((error: BusinessError) => {
      //发生异常时处理代码
      promptAction.showToast({ message: '发生异常:' + JSON.stringify(error) })
    })
  }

  build() {
    Column() {
      if (this.dataList.length > 0) {
        //Refresh:可以进行页面下拉操作并显示刷新动效的容器组件
        //refreshing:组件当前是否处于刷新中状态
        Refresh({ refreshing: $$this.isRefreshing, promptText: '数据加载中...' }) {
          List() {
            ForEach(this.dataList, (item: ResultData, index) => {
              ListItem() {
                Column() {
                  Row() {
                    //标题
                    Text(item.title)
                      .fontSize(17)
                      .lineHeight(26)
                      .fontWeight(300)
                      .maxLines(2)//最多显示n行
                      .textOverflow({ overflow: TextOverflow.Ellipsis }) //超过n行就显示省略号
                  }
                  .padding({ top: 2, bottom: 2 })
                  .width('100%')

                  //配图
                  if (item.thumbnail_pic_s) {
                    Row() {
                      Image(item.thumbnail_pic_s)
                        .width('100%')
                        .height(80)
                    }
                    .justifyContent(FlexAlign.SpaceEvenly)
                    .width('100%')
                  }

                  Row({ space: 12 }) {
                    //作者
                    Text(item.author_name)
                      .fontSize(13)
                      .fontWeight(500)
                      .fontColor($r('app.color.grey_color'))
                    //时间
                    Text(item.date)
                      .fontSize(13)
                      .fontWeight(500)
                      .fontColor($r('app.color.grey_color'))
                  }
                  .padding({ top: 5, bottom: 5 })
                  .width('100%')

                  //分割线
                  Divider()
                    .strokeWidth(1)
                    .color('#fff1f1f1')
                    .opacity(1)//设置透明度
                    .width('100%')

                }
                .padding(12)
                .width('100%')
                .onClick(() => {
                  //跳转到新闻详情页面
                  router.pushUrl({
                    url: 'pages/Test/WebPageDetails',
                    params: {
                      url: item.url,
                    },
                  }, router.RouterMode.Single)
                })
              }
            })
          }
          .alignListItem(ListItemAlign.Center)
          .height('98%')
        }
        //进入刷新状态时触发回调
        .onRefreshing(() => {
          //下拉时调用接口获取最新数据
          this.loadData();
        })
        .refreshOffset(64) //设置触发刷新的下拉偏移量
        .pullToRefresh(true) //设置当下拉距离超过refreshOffset时是否能触发刷新
      } else {
        Row() {
          Text('暂无数据')
            .fontWeight(800)
            .fontSize(35)
        }
        .width('100%')
        .justifyContent(FlexAlign.Center)
      }
    }
    .height('100%')
    .width('100%')
  }
}


class MyTools {
  /**
   * 发请求给第三方接口获取新闻数据
   */
  static getNewsData(url: string): Promise<NewsResult> {
    return new Promise((resolve: Function, reject: Function) => {
      let httpRequest = http.createHttp();
      httpRequest.request(url, {
        method: http.RequestMethod.GET,
      }).then((resp: http.HttpResponse) => {
        if (resp.responseCode === 200) {
          console.log('news = 获取数据成功:', resp.result)
          resolve(JSON.parse(resp.result.toString()))
        } else {
          console.log('news = 获取数据失败,error:', JSON.stringify(resp))
          reject('HTTP请求获取数据失败!')
        }
      })
    })
  }
}

页面往下拉时会自动加载第二页新闻数据

3. 新闻详情页面

上面代码中WebPageDetails页面代码如下:

import router from '@ohos.router';
import webview from '@ohos.web.webview';

/**
 * Author: 波波老师(weixin:javabobo0513)
 * Desc: 网页详情页面
 */
@Entry
@Component
struct WebPageDetails {
  controllerWeb: webview.WebviewController = new webview.WebviewController();
  //接收上一个页面传来的参数 url 的值(网址)
  @State url: string = (router.getParams() as Record<string, string>)['url'];

  build() {
    Column() {
      Row({ space: 3 }) {
        Text('返回')
          .onClick(() => {
            router.back();
          })
      }
      .padding(10)
      .width('100%')

      Web({ controller: this.controllerWeb, src: this.url })
        .id(String(new Date().getTime()))
        .domStorageAccess(true)
    }
  }
}

3. 小作业

以上代码只能查看推荐的新闻类型,其实新闻类型有下面这些类型:

['推荐', '国内', '国际', '娱乐', '体育', '军事', '科技', '财经', '游戏', '汽车', '健康']

请自由编写代码,实现列表页面选择指定新闻类型,就加载展示指定新闻类型内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【创造型模式】工厂方法模式

文章目录 工厂方法模式工厂方法模式当中的角色和职责工厂方法模式的实现工厂方法模式的优缺点 工厂方法模式 今天我们继续学习一例创造型设计模式——工厂方法模式。参考的主要资料是刘丹冰老师的《Easy 搞定 Golang 设计模式》。 工厂方法模式当中的角色和职责 简单来说&…

【MySQL】使用文件进行交互

目录 准备工作 1.从文本文件中读取数据&#xff08;导入&#xff09; 1.1.CSV 文件 1.2.设置导入导出的路径 1.3.导入文件 1.4.将数据写入文本文件&#xff08;导出&#xff09; 2.从文件中读取并执行SQL命令 2.1.通过mysql监视器执行编写在文件里面的SQL语句 2.2.通过…

# 大模型的本地部署与应用:从入门到实战

大模型的本地部署与应用&#xff1a;从入门到实战 在当今人工智能飞速发展的时代&#xff0c;大模型&#xff08;尤其是大型语言模型&#xff0c;LLMs&#xff09;已经成为自然语言处理&#xff08;NLP&#xff09;领域的核心力量。从文本生成、机器翻译到问答系统&#xff0c…

Java对象内存模型、如何判定对象已死亡?

一、Java对象内存模型 Java对象在内存中由三部分组成&#xff1a; 含类元数据指针&#xff08;指向方法区的Class对象&#xff09;和Mark Word&#xff08;存储对象哈希码、锁状态、GC分代年龄等信息&#xff09;。 若为数组对象&#xff0c;还包含数组长度数据。 1&#xff0c…

智慧化工园区安全风险管控平台建设方案(Word)

1 项目概况 1.1 园区概况 1.1.1 XX化工园区简况 1.1.2 企业现状 1.1.3 园区发展方向 1.1.4 园区信息化现状 1.2 项目建设背景 1.2.1 政策背景 1.3 项目建设需求分析 1.3.1 政策需求分析 1.3.2 安全生产监管需求分析 1.3.3 应急协同管理需求分析 1.3.4 工业互联网安…

【uniapp】 iosApp开发xcode原生配置项(iOS平台Capabilities配置)

如果你需要配置诸如&#xff1a;Access Wi-Fi Information 简单地说就是这个地址 ios平台capabilities配置 本来这种配置就是在Xcode的平台中选中即可&#xff0c;他们的信息会存储在XCode工程的.entitlements和Info.plist文件。 按照uniapp文档说的&#xff0c; HBuilderX4.…

MYSQL优化(1)

MYSQL调优强调的是如何提高MYSQL的整体性能&#xff0c;是一套整体方案。根据木桶原理&#xff0c;MYSQL的最终性能取决于系统中性能表现最差的组件。可以这样理解&#xff0c;即使MYSL拥有充足的内存资源&#xff0c;CPU资源&#xff0c;如果外存IO性能低下&#xff0c;那么系…

基于BERT预训练模型(bert_base_chinese)训练中文文本分类任务(AI老师协助编程)

新建项目 创建一个新的虚拟环境 创建新的虚拟环境(大多数时候都需要指定python的版本号才能顺利创建)&#xff1a; conda create -n bert_classification python3.9激活虚拟环境&#xff1a; conda activate myenvPS&#xff1a;虚拟环境可以避免权限问题&#xff0c;并隔离…

从数据到智能:openGauss+openEuler Intelligence的RAG架构实战

随着人工智能和大规模语言模型技术的崛起&#xff0c;传统的搜索引擎由于其只能提供简单的关键字匹配结果&#xff0c;已经越来越无法满足用户对于复杂、多样化和上下文相关的知识检索需求。与此相对&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术…

【Linux】初见,基础指令

前言 本文将讲解Linux中最基础的东西-----指令&#xff0c;带大家了解一下Linux中有哪些基础指令&#xff0c;分别有什么作用。 本文中的指令和选项并不全&#xff0c;只介绍较为常用的 pwd指令 语法&#xff1a;pwd 功能&#xff1a;显示当前所在位置&#xff08;路径&#xf…

什么是实时流数据?核心概念与应用场景解析

在当今数字经济时代&#xff0c;实时流数据正成为企业核心竞争力。金融机构需要实时风控系统在欺诈交易发生的瞬间进行拦截&#xff1b;电商平台需要根据用户实时行为提供个性化推荐&#xff1b;工业物联网需要监控设备状态预防故障。这些场景都要求系统能够“即时感知、即时分…

工业RTOS生态重构:从PLC到“端 - 边 - 云”协同调度

一、引言 在当今数字化浪潮席卷全球的背景下&#xff0c;工业领域正经历着深刻变革。工业自动化作为制造业发展的基石&#xff0c;其技术架构的演进直接关系到生产效率、产品质量以及企业的市场竞争力。传统的PLC&#xff08;可编程逻辑控制器&#xff09;架构虽然在工业控制领…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的社群构建与新型消费迎合策略研究

摘要&#xff1a;随着个性化与小众化消费的崛起&#xff0c;消费者消费心理和模式发生巨大变化&#xff0c;社群构建对商家迎合新型消费特点、融入市场经济发展至关重要。开源链动21模式AI智能名片S2B2C商城小程序的出现&#xff0c;为社群构建提供了创新工具。本文探讨该小程序…

高性能RPC框架--Dubbo(五)

Filter&#xff1a; filter过滤器动态拦截请求&#xff08;request&#xff09;或响应&#xff08;response&#xff09;以转换或使用请求或响应中包含的信息。同时对于filter过滤器不仅适合消费端而且还适合服务提供端。我们可以自定义在什么情况下去使用filter过滤器 Activa…

搭建自己的语音对话系统:开源 S2S 流水线深度解析与实战

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

feign调用指定服务ip端口

1 背景 在springcloud开发时候&#xff0c;同时修改了feign接口和调用方的代码&#xff0c;希望直接在某个环境调用修改的代码&#xff0c;而线上的服务又不希望被下线因为需要继续为其他访问页面的用户提供功能后端服务&#xff0c;有时候甚者包含你正在修改的功能。 2 修改…

【深尚想!爱普特APT32F1023H8S6单片机重构智能电机控制新标杆】

在智能家电与健康器械市场爆发的今天&#xff0c;核心驱动技术正成为产品突围的关键。传统电机控制方案面临集成度低、开发周期长、性能瓶颈三大痛点&#xff0c;而爱普特电子带来的APT32F1023H8S6单片机无感三合一方案&#xff0c;正在掀起一场智能电机控制的技术革命。 爆款基…

Unity EventCenter 消息中心的设计与实现

在开发过程中&#xff0c;想要传递信号和数据&#xff0c;就得在不同模块之间实现通信。直接通过单例调用虽然简单&#xff0c;但会导致代码高度耦合&#xff0c;难以维护。消息中心提供了一种松耦合的通信方式&#xff1a;发布者不需要知道谁接收事件&#xff0c;接收者不需要…

MySQL远程连接10060错误:防火墙端口设置指南

问题描述&#xff1a; 如果你通过本机服务器远程连接MySQL&#xff0c;出现10060错误&#xff0c;那可能是你的防火墙的问题 解决&#xff1a; 第一步&#xff1a;查看防火墙规则 通过以下命令查询&#xff0c;看ports是否开放了3306端口&#xff0c;目前只开放了22端口 f…

使用 OpenCV 实现 ArUco 码识别与坐标轴绘制

&#x1f3af; 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制&#xff08;含Python源码&#xff09; Aruco 是一种广泛用于机器人、增强现实&#xff08;AR&#xff09;和相机标定的方形标记系统。本文将带你一步一步使用 Python OpenCV 实现图像中多个 ArUco 码的检测与坐标轴…