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})

     

    每天都要努力微笑,努力学习,每一天都要对得起自己。
  • 相关阅读:
    kernel list 实践
    rpm打包
    void out2() const{
    剑指offer python版 两个链表的第一个公共结点
    剑指offer python版 数组中的逆序对
    剑指offer python版 字符串中第一个只出现一次的字符
    剑指offer python版 丑数 (只含有2,3,5因子)
    剑指offer python版 最长不含重复字符的子字符
    剑指offer python版 礼物的最大价值
    剑指offer python版 数字序列中某一位的数字
  • 原文地址:https://www.cnblogs.com/likecn/p/11721081.html
Copyright © 2011-2022 走看看