当前位置: 首页 > news >正文

fetch的简单使用

文章目录

    • 前言
    • vue开发环境搭建
    • fetch demo

前言

公司的客户端使用了GitHub - chromiumembedded/cef 。所以,有时候不得不写前端代码。有时候逻辑很清晰,但在语法上折腾半天。

这周在一个Fetch API - MDN 调用上踩了坑,所以去读了它的文档,顺道整理下。

在开始之前,最好和vue混个脸熟,知道它是干啥的。简单的刷下视频快速入门下:2022年最新版Vue3全套教程

本文完整的示例代码见:1-fetch-demo


vue开发环境搭建

参考下:Windows 环境搭建 Vue 开发环境 | 小决的专栏、十分钟上手-搭建vue2.0开发环境

  1. 安装Node.js。安装之后,验证安装成功。

    node.exe -v
    v16.17.0
    
  2. 全局安装vue-cli脚手架 - 略

     npm.cmd install --global vue-cli
     4 vulnerabilities (2 moderate, 2 high)
     To address all issues (including breaking changes), run:
    
     npm audit fix --force
     npm WARN using --force Recommended protections disabled.
     npm ERR! code ENOLOCK
     npm ERR! audit This command requires an existing lockfile.
     npm ERR! audit Try creating one first with: npm i --package-lock-only
     npm ERR! audit Original error: loadVirtual requires existing shrinkwrap file
    
     npm.cmd remove -g @vue/cli
    
  3. 得,我们替换使用Vite

    npm init vue@latest
    
    Need to install the following packages:
    create-vue@3.3.2
    Ok to proceed? (y) y
    
    Vue.js - The Progressive JavaScript Framework
    
    √ Project name: ... fetch-demo
    √ Add TypeScript? ... No / Yes
    √ Add JSX Support? ... No / Yes
    √ Add Vue Router for Single Page Application development? ... No / Yes
    √ Add Pinia for state management? ... No / Yes
    √ Add Vitest for Unit Testing? ... No / Yes
    √ Add Cypress for both Unit and End-to-End testing? ... No / Yes
    √ Add ESLint for code quality? ... No / Yes
    
    Scaffolding project in E:\code\tmp\fetch-demo...
    
    Done. Now run:
    
      cd fetch-demo
      npm install
      npm run dev
    
  4. vscode安装插件。参考:VSCode 开发Vue必备插件


fetch demo

Fetch API - MDN 提供了一个获取资源的接口(包括跨域请求)。fetch() 必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 Promise 对象。一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。它让你能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。(类似于std::promise - cppreference.com,没用过这个,std::future - cppreference.com的接口层次高些。)

关于fetch的介绍,还可以参考:Fetch API 教程 - 阮一峰的网络日志、promise - How to use fetch in TypeScript - Stack Overflow

代码很简单,访问一个地址,并获取响应状态码。(原本是想访问一个页面,然后浏览器展示fetch到的页面,这似乎不容易,至少对于我这个web菜狗,是做不到的)

<script lang="ts">
export default {
  data() {
      return {
        url: String,
        page: String
      }
    },
  methods: {
    async copy_page(url:string) : Promise<any> {
      this.url = url
      this.page = await fetch(this.url,{
        method: 'get',
        headers: {
          'Content-Type': 'application/json',
        },
      }).then(resp =>{
        console.debug(resp)
        return resp.status
      })
    }, 
  },
  mounted() {
    this.page = this.copy_page('/baidu/s?wd=fetch-demo')
    console.log('load app vue')
  }
}
</script>

<template>
  <div>{{page}}</div>
</template>

<style scoped>
</style>
plate>

<style scoped>
</style>

代码运行的时候,会出现跨域请求的问题。

参考:跨源资源共享(CORS) - HTTP | MDN、跨域的解决方法有哪些?JSONP的原理?CORS怎么使用?Nginx如何设置? - BiliBili

跨域请求的原理是,浏览器执行当前页面服务器的请求,而请求的资源却在另一个域名的服务器上。跨域请求,可能出现CSRF攻击_大1234草的博客-CSDN博客的问题。但,必须可以在不同站点间跳来跳去,比如超链接,否则站点会成为一个个孤岛。

vite可以通过proxy来解决跨站问题,可参考:vite-proxy-BiliBili、开发服务器选项 | Vite 官方中文文档

配置如下。

export default defineConfig({
  xxxx,
  xxxx,
  server: {
    proxy:{
      '/baidu':{
        target:'https://www.baidu.com',
        changeOrigin:true,
        rewrite: path => path.replace(/^\/baidu/,'')
      },
      '/koal':{
        target:'http://www.koal.com',
        changeOrigin:true,
        rewrite: path => path.replace(/^\/koal/,'')
      }
    }
  }
})

官方文档中写道,是使用 http-proxy完成代理。

猜测代理过程大概是这样。浏览器去执行请求,是跨站。那浏览器把锅推回去,让服务器自己去请求其他服务器的资源。请求结束之后,再将内容返回给浏览器就好了。是一个本地的反向代理过程。

相关文章:

  • 程序员应了解的那些事(111)~进程、线程及堆栈关系
  • NTU 课程笔记:向量和矩阵
  • ElasticSearch Python API教程
  • Linux (五)- mv 命令
  • 20220831-basic-cuda-interface
  • 3.4背景图片位置
  • Android GNSSGPS 基础知识以及代码流程分析
  • 微控制器通信2 -基础(微逻辑电平与I/O电压)
  • 设计模式-享元模式、享元模式示例
  • 过滤器---普通过滤器使用、串联过滤器、局部与全局过滤器
  • Docker安装Redis 7.x单机模式
  • 2022-09-04 C++并发编程(十八)
  • 插入一百万数据的最优解分析和耗时
  • DockerFile的基本知识及利用DockerFile构建镜像
  • Spring(二)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 10个确保微服务与容器安全的最佳实践
  • Create React App 使用
  • es的写入过程
  • Flannel解读
  • Java Agent 学习笔记
  • Javascript 原型链
  • LeetCode29.两数相除 JavaScript
  • nodejs调试方法
  • React的组件模式
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 聊聊flink的TableFactory
  • 十年未变!安全,谁之责?(下)
  • 数据科学 第 3 章 11 字符串处理
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用Python写一份独特的元宵节祝福
  • - 转 Ext2.0 form使用实例
  • #Linux(make工具和makefile文件以及makefile语法)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (14)Hive调优——合并小文件
  • (NSDate) 时间 (time )比较
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (三)模仿学习-Action数据的模仿
  • (四)JPA - JQPL 实现增删改查
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)h264中avc和flv数据的解析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .equals()到底是什么意思?
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 依赖注入和配置系统
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net7 环境安装配置
  • @Autowired @Resource @Qualifier的区别
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [C# 网络编程系列]专题六:UDP编程