fetch 如何请求常见数据格式

本文深入讲解Fetch API,一种用于异步获取资源的现代替代方案,相较于传统的XMLHttpRequest,它提供了更简洁、逻辑更清晰的语法,支持Promise和async/await,适用于跨网络请求,尤其适合ServiceWorkers的使用。

fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法。参考阮老师的文章

那我们首先讲讲在没有fetch的时候,我们是如何获取异步资源的:

//发送一个get请求是这样的:

//首先实例化一个XMLHttpRequest对象
var httpRequest = new XMLHttpRequest();

//注册httpRequest.readyState改变时会回调的函数,httpRequest.
//readyState共有5个可能的值,
//0	UNSENT (未打开)	open()方法还未被调用;
//1	OPENED  (未发送)	send()方法还未被调用;
//2	HEADERS_RECEIVED (已获取响应头)	send()方法已经被调用, 响应头和响应状态已经返回;
//3	LOADING (正在下载响应体)	响应体下载中; responseText中已经获取了部分数据;
//4	DONE (请求完成)	整个请求过程已经完毕.
httpRequest.onreadystatechange = function(){
 //该回调函数会被依次调用4次
 console.log(httpRequest.readyState);

 if(httpRequest.readyState===4){
   //请求已完成
   if(httpRequest.status===200){
     //http状态为200
     console.log(httpRequest.response);

     var data = JSON.parse(httpRequest.response);
     console.log(data);
   }
 }

}

//请求的网址
var url = "http://127.0.0.1:7777/list";
//该方法为初始化请求,第一个参数是请求的方法,比如GET,POST,PUT,第二个参数是请求的url
httpRequest.open('GET',url,true);

//设置http请求头
httpRequest.setRequestHeader("Content-Type","application/json");

//发出请求,参数为要发送的body体,如果是GET方法的话,一般无需发送body,设为空就可以
httpRequest.send(null);

关于XMLHttpRequest的更多用法请参照:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest#open()

如果用了fetch之后,发送一个get请求是这样的:

//请求的网址
var url = "http://127.0.0.1:7777/list";
//发起get请求
var promise = fetch(url).then(function(response) {

   //response.status表示响应的http状态码
   if(response.status === 200){
     //json是返回的response提供的一个方法,会把返回的json字符串反序列化成对象,也被包装成一个Promise了
     return response.json();
   }else{
     return {}
   }

});
    
promise = promise.then(function(data){
  //响应的内容
	console.log(data);
}).catch(function(err){
	console.log(err);
})

接下来介绍下fetch的语法:

/**
参数:
input:定义要获取的资源。可能的值是:一个URL或者一个Request对象。
init:可选,是一个对象,参数有:
	method: 请求使用的方法,如 GET、POST。
	headers: 请求的头信息,形式为 Headers 对象或 ByteString。
	body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
	mode: 请求的模式,如 cors、 no-cors 或者 same-origin,默认为no-cors,该模式允许来自 CDN 的脚本、其他域的图片和其他一些跨域资源,但是首先有个前提条件,就是请求的 method 只能是HEAD、GET 或 POST。此外,如果 ServiceWorkers 拦截了这些请求,它不能随意添加或者修改除这些之外 Header 属性。第三,JS 不能访问 Response 对象中的任何属性,这确保了跨域时 ServiceWorkers 的安全和隐私信息泄漏问题。cors模式允许跨域请求,same-origin模式对于跨域的请求,将返回一个 error,这样确保所有的请求遵守同源策略。
	credentials: 请求的 credentials,如 omit、same-origin 或者 include。
	cache:  请求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.
返回值:一个 Promise,resolve 时回传 Response 对象。
*/
fetch(input, init).then(function(response) {  });

一个发送post请求的示例:

fetch("http://127.0.0.1:7777/postContent", {
  method: "POST",
  headers: {
      "Content-Type": "application/json",
  },
  mode: "cors",
  body: JSON.stringify({
      content: "留言内容"
  })
}).then(function(res) {
  if (res.status === 200) {
      return res.json()
  } else {
      return Promise.reject(res.json())
  }
}).then(function(data) {
  console.log(data);
}).catch(function(err) {
  console.log(err);
});

如果考虑低版本浏览器的问题的话,引入https://github.com/github/fetch/blob/master/fetch.js 即可兼容。

 

一 序言

在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方法,它不仅提供了一种简单,合乎逻辑的方式来跨网络异步获取资源,而且可以很容易地被其他技术使用,例如 Service Workers。

 

 

 

二 与Ajax对比

使用Ajax请求一个 JSON 数据一般是这样:

var xhr = new XMLHttpRequest();
xhr.open('GET', url/file,true);
xhr.onreadystatechange = function() {
   if(xhr.readyState==4){
        if(xhr.status==200){
            var data=xhr.responseText;
             console.log(data);
   }
};
xhr.onerror = function() {
  console.log("Oh, error");
};
xhr.send();
复制代码

同样我们使用fetch请求JSON数据:

fetch(url).then(response => response.json())//解析为可读数据
  .then(data => console.log(data))//执行结果是 resolve就调用then方法
  .catch(err => console.log("Oh, error", err))//执行结果是 reject就调用catch方法
复制代码

从两者对比来看,fetch代码精简许多,业务逻辑更清晰明了,使得代码易于维护,可读性更高。 总而言之,Fetch 优点主要有:

1. 语法简洁,更加语义化,业务逻辑更清晰

2. 基于标准 Promise 实现,支持 async/await

3. 同构方便,使用isomorphic-fetch

三 Promise简介

由于 Fetch API 是基于 Promise 设计,接下来我们简单介绍下Promise工作流程,方便大家更好理解Fetch。

Promise工作原理

 

 

fetch方法返回一个Promise对象, 根据 Promise Api 的特性, fetch可以方便地使用then方法将各个处理逻辑串起来, 使用 Promise.resolve() 或 Promise.reject() 方法将分别返会肯定结果的Promise或否定结果的Promise, 从而调用下一个then 或者 catch。一旦then中的语句出现错误, 也将跳到catch中。

四 请求常见数据格式

接下来将介绍如何使用fetch请求本地文本数据,请求本地JSON数据以及请求网络接口。其实操作相比与Ajax,简单很多!

//HTML部分
  <div class="container">
    <h1>Fetch Api sandbox</h1>
    <button id="button1">请求本地文本数据</button>
    <button id="button2">请求本地json数据</button>
    <button id="button3">请求网络接口</button>
    <br><br>
    <div id="output"></div>
  </div>
  <script src="app.js"></script>
复制代码

1.fetch请求本地文本数据

本地有一个test.txt文档,通过以下代码就可以获取其中的数据,并且显示在页面上。

document.getElementById('button1').addEventListener('click',getText);
function getText(){
  fetch("test.txt")
      .then((res) => res.text())//注意:此处是res.text()
      .then(data => {
        console.log(data);
        document.getElementById('output').innerHTML = data;
      })
      .catch(err => console.log(err));
}
复制代码

2.fetch请求本地JSON数据

本地有个posts.json数据,与请求本地文本不同的是,得到数据后还要用forEach遍历,最后呈现在页面上。

document.getElementById('button2').addEventListener('click',getJson);
function getJson(){
  fetch("posts.json")
      .then((res) => res.json())
      .then(data => {
        console.log(data);
        let output = '';
        data.forEach((post) => {
          output += `<li>${post.title}</li>`;
        })
        document.getElementById('output').innerHTML = output;
      })
      .catch(err => console.log(err));
}
复制代码

3.fetch请求网络接口

获取https://api.github.com/users中的数据,做法与获取本地JSON的方法类似,得到数据后,同样要经过处理

document.getElementById('button3').addEventListener('click',getExternal);
function getExternal(){
  // https://api.github.com/users
  fetch("https://api.github.com/users")
      .then((res) => res.json())
      .then(data => {
        console.log(data);
        let output = '';
        data.forEach((user) => {
          output += `<li>${user.login}</li>`;
        })
        document.getElementById('output').innerHTML = output;
      })
      .catch(err => console.log(err));
}
<think>好的,我现在要回答用户关于Fetch请求标准格式和用法的问题。首先,我需要回忆Fetch的基本知识,确保自己理解正确。Fetch API是用于发起网络请求的现代方法,替代了传统的XMLHttpRequest。它基于Promise,使用起来更简洁。 用户想要标准格式和示例,所以我要先说明基本语法结构。标准格式通常是使用fetch(url, options),其中url是必需的,options可选。需要详细解释options中的常用参数,比如method、headers、body等。这里要注意用户提供的引用内容,特别是引用[1]提到的options参数可选,但有些情况下可能需要设置method,比如POST请求必须指定method为'POST'。 然后,我需要考虑不同请求方法的示例,比如GET和POST,因为这是最常见的。GET请求比较简单,而POST需要设置method、headers(如Content-Type)和body。要注意body的格式,比如JSON.stringify处理数据,并设置正确的Content-Type为application/json。引用[3]提到Request对象的使用,特别是当需要多次使用同一Request时,必须调用clone()方法,但用户的问题可能更关注基本用法,所以可能暂时不深入这点,但可以提一下。 还要提到Fetch返回的是Promise,因此需要用.then()和.catch()处理响应和错误,或者使用async/await。引用[4]说明了Promise的处理,这部分需要包含在回答中,比如链式调用和错误捕获。 需要确保示例代码正确,语法无误。例如,POST示例中,body必须是字符串,所以要用JSON.stringify。同时,headers需要正确设置Content-Type。另外,处理响应时,通常先检查response.ok,再解析JSON,这也是良好的实践。 用户提供的引用中有提到Request对象的拷贝问题,但可能对于基础用户来说,先掌握基本用法更重要,所以可以简要提及或放在注意事项里。此外,可能需要提到跨域问题,比如CORS,但用户的问题可能不涉及,所以根据情况决定是否包含。 最后,生成相关问题,考虑用户可能的后续疑问,比如错误处理、文件上传、拦截请求、与XHR对比等,参考示例中的问题结构,提出几个相关问题。 总结步骤: 1. 介绍Fetch的基本语法,参数说明。 2. 提供GET和POST的示例代码。 3. 解释Promise的处理方式,包括async/await。 4. 提及注意事项,如CORS、错误处理。 5. 生成相关问题。</think>### Fetch请求的标准格式及用法 #### 一、Fetch请求标准格式 Fetch请求的基本语法为: $$fetch(url, options)$$ - **url**(必填): 请求的目标地址,例如 `'https://api.example.com/data'` - **options**(可选): 配置请求的选项对象,包含以下常用属性[^1][^3]: - `method`: 请求方法(默认为`GET`),如 `GET`、`POST`、`PUT` - `headers`: 请求头信息(对象格式),例如 `{ 'Content-Type': 'application/json' }` - `body`: 请求体数据(需根据请求头中的`Content-Type`选择格式),如JSON字符串、`FormData`对象等 - `mode`: 请求模式(如`cors`、`no-cors`) - `credentials`: 是否携带凭据(如`include`、`same-origin`) --- #### 二、用法示例 ##### 1. **GET请求** ```javascript // 基础GET请求 fetch('https://api.example.com/data') .then(response => { if (!response.ok) throw new Error('请求失败'); return response.json(); // 解析JSON响应 }) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` ##### 2. **POST请求JSON数据)** ```javascript // 提交JSON数据 fetch('https://api.example.com/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Alice', age: 30 }) }) .then(response => response.json()) .then(result => console.log('Success:', result)) .catch(error => console.error('Error:', error)); ``` ##### 3. **使用async/await简化** ```javascript async function fetchData() { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) throw new Error('请求失败'); const data = await response.json(); console.log(data); } catch (error) { console.error('Error:', error); } } ``` --- #### 三、注意事项 1. **响应处理**: - 需通过`response.json()`、`response.text()`等方法解析响应体[^4]。 - 检查`response.ok`判断HTTP状态码是否在200-299范围内。 2. **错误捕获**: - Fetch仅对网络错误(如无法连接)触发`catch`,HTTP错误状态码(如404)需手动处理[^4]。 3. **Request对象复用**: - 若需多次使用同一Request对象(含请求体),需调用`.clone()`方法[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值