fetch 代替 XMLHttpRequest (json-server 模拟后台接口)

一、fetch 是 XMLHttpRequest 的替代方案。说白了就是除了 ajax 获取后台数据之外也可以用fetch 来获取。

二、fetch 的支持性还不是很好。挂载于BOM中可以通过浏览器直接访问。

  1.支持情况

  

  当然,如果不支持fetch也没有问题,可以使用第三方的ployfill来实现只会fetch:whatwg-fetch

三、JSON-SERVER模拟后台接口

  1.初始化项目 npm init

  2.安装JSON-SERVER:  npm install --save-dev json-server

  3.在跟目录下面创建一个db.json 写入

{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}

  4.在package.json 中添加一段代码

"scripts": {
  "server": "json-server db.json", // 新加行
  "test": "..."
}

  5.npm run server

  

三个接口已经生成,支持post(新增) delete(删除) put(修改) get(查询)

关于JSON-SERVER 其他的配置我就不说了。有兴趣的自己去官网查看下。目前只是模拟一个后台接口。

四、GET请求。

1.

fetch('http://10.63.68.93:3000/profile', {
        method: 'GET'
    }).then((res)=>{
          return res.json()
    }).then(res => {
        console.log(res) //Object {name: "typicode"}
    })

 2.get 请求参数的传递

    把参数带在URL上面

 fetch('http://10.63.68.93:3000/profile?a=2&b=1', {
        method: 'GET'
    }).then((res)=>{
          return res.json()
    }).then(res => {
        console.log(res) //Object {name: "typicode"}
    })

五、POST请求

  1.与GET请求类似,POST请求的指定也是在fetch的第二个参数中:

fetch('http://10.63.68.93:3000/comments', {
        method: 'POST'
    }).then((res)=>{
        return res.json()
    }).then(res => {
        console.log(res) //Object {name: "typicode"}
    })

  2.POST请求的参数传递

var paramsString = "q=URLUtils.searchParams&topic=api"
    var searchParams = new URLSearchParams(paramsString);
    fetch('http://10.63.68.93:3000/posts', {
        method: 'POST',
        body: searchParams // 这里是请求对象   具体api 去看fetch 官网的 URLSearchParams
    }).then((res)=>{
        return res.json()
    }).then(res => {
        console.log(res) 
    })

六、设置请求头

let myHeaders = new Headers();

myHeaders.append('Content-Type', 'text/xml');

myHeaders.get('Content-Type');
// should return 'text/xml'

  

var paramsString = "q=URLUtils.searchParams&topic=api"
    var searchParams = new URLSearchParams(paramsString);
    let myHeaders = new Headers();

    myHeaders.append('Content-Type', 'text/xml');

    myHeaders.get('Content-Type');
    /*
    myHeaders = new Headers({
  "Content-Type": "text/plain",
  "Content-Length": content.length.toString(),
  "X-Custom-Header": "ProcessThisImmediately",
});

     */
    // should return 'text/xml'
    fetch('http://10.63.68.93:3000/posts', {
        method: 'POST',
        headers:myHeaders,
        body: searchParams // 这里是请求对象   具体api 去看fetch 官网的 URLSearchParams
    }).then((res)=>{
        return res.json()
    }).then(res => {
        console.log(res)
    })

七、强制带cookie

  默认情况下, fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于维护一个用户会话,则导致未经认证的请求(要发送 cookies,必须发送凭据头).

八、fetch 封装ajax请求

/**
 * 将对象转成 a=1&b=2的形式
 * @param obj 对象
 */
function obj2String(obj, arr = [], idx = 0) {
  for (let item in obj) {
    arr[idx++] = [item, obj[item]]
  }
  return new URLSearchParams(arr).toString()
}

/**
 * 真正的请求
 * @param url 请求地址
 * @param options 请求参数
 * @param method 请求方式
 */
function commonFetcdh(url, options, method = 'GET') {
  const searchStr = obj2String(options)
  let initObj = {}
  if (method === 'GET') { // 如果是GET请求,拼接url
    url += '?' + searchStr
    initObj = {
      method: method,
      credentials: 'include'
    }
  } else {
    initObj = {
      method: method,
      credentials: 'include',
      headers: new Headers({
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded'
      }),
      body: searchStr
    }
  }
  fetch(url, initObj).then((res) => {
    return res.json()
  }).then((res) => {
    return res
  })
}

/**
 * GET请求
 * @param url 请求地址
 * @param options 请求参数
 */
function GET(url, options) {
  return commonFetcdh(url, options, 'GET')
}

/**
 * POST请求
 * @param url 请求地址
 * @param options 请求参数
 */
function POST(url, options) {
  return commonFetcdh(url, options, 'POST')
}

 

转载于:https://www.cnblogs.com/createGod/p/8472811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值