zoukankan      html  css  js  c++  java
  • fetch请求用法以及封装

    一、说明

    原生js提供了两种数据请求方式fetch,ajax

    - ajax需要封装的, fetch不需要

    - ajax不太符合MV* 开发方式,fetch可以认为是js为了MV*方式做的量身打造

    - fetch也是Promise

     

    功能:用fetch请求动态数据

    1、get请求

    (1)不带参数

      1 // 通过fetch获取百度的错误提示页面
      2 fetch('https://www.baidu.com/search/error.html') // 返回一个Promise对象
      3   .then((res)=>{
      4     return res.text() // res.text()是一个Promise对象
      5   })
      6   .then((res)=>{
      7     console.log(res) // res是最终的结果
      8   })

    (2)带参数:

    get请求参数是连接在url上

      1 methods: {
      2       get () {
      3         fetch(`${ BASE_URL }/get.php?a=1&b=2`)//get请求参数是连接在url上
      4           .then( data => data.text() )
      5           .then( res => {
      6             this.num = res
      7           })
      8           .catch( err => console.log( err ))
      9       },

    method: 'GET'不写默认是get请求

    2、post请求

    (1)不带参数

      1 // 通过fetch获取百度的错误提示页面
      2 fetch('https://www.baidu.com/search/error.html', {
      3     method: 'POST' // 指定是POST请求
      4   })
      5   .then((res)=>{
      6     return res.text()
      7   })
      8   .then((res)=>{
      9     console.log(res)
     10   })

    (2)带参数

    post请求传递参数:

    body: new URLSearchParams([["a", 1],["b", 2]]).toString()

    注意:POST请求的参数,一定不能放在URL中,这样做的目的是防止信息泄露。

      1  post () {
      2         /*
      3           1. post请求参数如何携带
      4         */
      5         fetch(`${ BASE_URL }/post.php`,{
      6           method: 'POST',
      7           // body: JSON.stringify({
      8           //   a: 1,
      9           //   b: 2
     10           // })
     11           headers: new Headers({
     12             'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交
     13           }),
     14           body: new URLSearchParams([["a", 1],["b", 2]]).toString()
     15         }).then( data => data.text() )
     16           .then( res => {
     17             this.sum = res
     18           })
     19           .catch( err => console.log( err ))
     20       },

    总结:

    fetch( url, config ).then().then().catch()

      1  getMovies () {
      2         /* 第一个then是为数据格式化,可以格式化的数据类型有: json  text   blob[ 二进制 ]
      3            第二个then才是得到的数据
      4         */
      5         // fetch( url, config ).then().then().catch()
      6 
      7         fetch('./mock/movie.json')
      8           .then( data => data.json() )
      9           .then( res => {
     10             console.log("兵哥: getMovies -> res", res)
     11             this.movies = res.movieList
     12           })
     13       }

     

    得到json格式数据:

      1 // 通过fetch获取百度的错误提示页面
      2 fetch('https://www.baidu.com/rec?platform=wise&ms=1&rset=rcmd&word=123&qid=11327900426705455986&rq=123&from=844b&baiduid=A1D0B88941B30028C375C79CE5AC2E5E%3AFG%3D1&tn=&clientWidth=375&t=1506826017369&r=8255', { // 在URL中写上传递的参数
      3     method: 'GET',
      4     headers: new Headers({
      5       'Accept': 'application/json' // 通过头指定,获取的数据类型是JSON
      6     })
      7   })
      8   .then((res)=>{
      9     return res.json() // 返回一个Promise,可以解析成JSON
     10   })
     11   .then((res)=>{
     12     console.log(res) // 获取JSON数据
     13   })

     

    格式化数据:

    data.json()

    data.text()

    处理数据可以使用querystring

      1 const qs = require( 'querystring' )
      2 const str = 'a=1&b=2'
      3 const obj = { a: '1', b: '2' }
      4 console.log( qs.parse( str ))
      5 console.log( qs.stringify( obj ))

     

    强制带Cookie:

      1 // 通过fetch获取百度的错误提示页面
      2 fetch('https://www.baidu.com/search/error.html', {
      3     method: 'GET',
      4     credentials: 'include' // 强制加入凭据头
      5   })
      6   .then((res)=>{
      7     return res.text()
      8   })
      9   .then((res)=>{
     10     console.log(res)
     11   })

    二、fetch的封装

     

      1 /**
      2  * 将对象转成 a=1&b=2的形式
      3  * @param obj 对象
      4  */
      5 function obj2String(obj, arr = [], idx = 0) {
      6   for (let item in obj) {
      7     arr[idx++] = [item, obj[item]]
      8   }
      9   return new URLSearchParams(arr).toString()
     10 }
     11 
     12 /**
     13  * 真正的请求
     14  * @param url 请求地址
     15  * @param options 请求参数
     16  * @param method 请求方式
     17  */
     18 function commonFetcdh(url, options, method = 'GET') {
     19   const searchStr = obj2String(options)
     20   let initObj = {}
     21   if (method === 'GET') { // 如果是GET请求,拼接url
     22     url += '?' + searchStr
     23     initObj = {
     24       method: method,
     25       credentials: 'include'
     26     }
     27   } else {
     28     initObj = {
     29       method: method,
     30       credentials: 'include',
     31       headers: new Headers({
     32         'Accept': 'application/json',
     33         'Content-Type': 'application/x-www-form-urlencoded'
     34       }),
     35       body: searchStr
     36     }
     37   }
     38   fetch(url, initObj).then((res) => {
     39     return res.json()
     40   }).then((res) => {
     41     return res
     42   })
     43 }
     44 
     45 /**
     46  * GET请求
     47  * @param url 请求地址
     48  * @param options 请求参数
     49  */
     50 function GET(url, options) {
     51   return commonFetcdh(url, options, 'GET')
     52 }
     53 
     54 /**
     55  * POST请求
     56  * @param url 请求地址
     57  * @param options 请求参数
     58  */
     59 function POST(url, options) {
     60   return commonFetcdh(url, options, 'POST')
     61 }
     62 GET('https://www.baidu.com/search/error.html', {a:1,b:2})
     63 POST('https://www.baidu.com/search/error.html', {a:1,b:2})

     

    每天都要努力微笑,努力学习,每一天都要对得起自己。
  • 相关阅读:
    查看IIS进程W3WP.exe对应网站进程池的PID
    【C#】结对项目开发-电梯调度仿真系统(Bata版)(党云龙、黄为)
    对于敏捷开发的理解!~~~~~~~~(黄为)
    【C】二维数组求最大子数组(基于一维数组的拓展)
    【C#】结对项目开发-电梯调度仿真系统(内部开发者版)(党云龙、黄为)
    【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)
    【C#】结对项目开发-电梯调度需求分析(党云龙、黄为)
    C语言中求整型数组中的最大值!~~~~(黄为,刘佳琪)
    读入文本,找出出现频率最高的10个单词~~~~
    Emmet HTML/CSS代码快速编写神器
  • 原文地址:https://www.cnblogs.com/likecn/p/11721081.html
Copyright © 2011-2022 走看看