关于网络请求

ajax与XMLHttpRequest

前言

XMLHttpRequest是浏览器提供的一个对象,正是这个对象使得浏览器可以发出http请求、接收http响应。
ajax是一种技术方案,他最核心得依赖是XMLHttpRequest对象 只能说 使用XMLHttpRequest对象发送ajax请求。

get请求

var xhr = new XMLHttpRequest();
xhr.open('get',' url地址 ');//如果get请求需要传参 需要拼接在url后面
xhr.send(null); // get请求 参数不放在请求体 所以请求体为null
xhr.onreadystatechange=function(){
  if(xhr.readystate == 4){
      xhr.responseText //响应数据
  }
}

post请求

var xhr = new XMLHttpRequest();
xhr.open('post',' url地址 ');
xhr.send(请求体);
xhr.onreadystatechange=function(){
    .....
}

关于Content-Type

Content-Type是表明请求体数据类型
  get请求:
    因为get请求不放在请求体 故 get请求不需要设Content-Type

  post请求:
     不设置Content-Type 发送post请求,查看浏览器开发者工具 发现传参时候默认Content-Type 为                  text/plain;charset=UTF-8
     xhr发送post请求 默认Content-Type 为 text/plain;charset=UTF-8 表明纯文本
     
     如果发送的请求体为json格式 需要手动更改Content-Type
         xhr.setRequestHeader('Content-Type','application/json');
         xhr.send('{"name":"张三"}'); //注意json请求体 key 和 value 必须使用双括号包裹
     注意:Content-Type为application/json格式时,浏览器会先发送 OPTIONS 请求 
     目的是查看服务器是否支持该请求,如果不支持 则真正的请求不会发送成功
     常见问题 后台设置Access-Control-Allow-Headers没有添加content-type 会发送失败
         res.header("Access-Control-Allow-Headers", "X-Requested-With");
         (https://blog.csdn.net/qq_42396168/article/details/105547334)
     
     表单form 默认是get请求 改为post请求后 默认Content-Type为 application/x-www-form-urlencoded
     application-x-www.form-urlencoded表示表单请求 参数格式为 key1=value1&key2=value2
     如果不通过表单的action跳转请求、手动xhr发送请求 需要手动设置Content-Type为表单请求
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        xhr.send('key1=v1&key2=v2');
     
     当需要上传文件类型时,表单form上传时 需要设置enctype="multipart/form-data" 表示上传的是formData对象
     不使用表单的action跳转请求、手动发送ajax请求时,需要手动设置Content-Type 为 multipart/form-data
     并且请求体内容为formData格式
        xhr.setRequestHeader('Content-Type','multipart/form-data');
        var formData = new FormData();
        formData.append('k','v');
        xhr.send(formData);

关于responseType

responseType 告诉浏览器将后台返回的数据以什么类型响应回来
如下载图片
var xhr = new XMLHttpRequest();
xhr.open('get',' url地址 ');
xhr.responseType='blob'
xhr.send();
xhr.onreadystatechange=function(){
     var blob =  xhr.response // 此时响应内容response即是blob类型
     //随后根据blob类型 生成下载链接 触发点击事件即可
     var url = URL.createObjectUrl(blob);
     var link = document.createElement('a');
     link.href=url;
     link.download='aa.jpg'; //download名字的后缀需要与blob类型一致 防止乱码
     link.click();//触发a链接的点击事件 实现下载
}

关于响应responseText/response

xhr不设置responseType时,响应内容会在xhr.responseText中
如果设置了响应类型responseType 响应内容会在response中
    xhr.responseTypr='blob';
    获取内容:  xhr.response
 全面获取响应内容的写法:
  const res = xhr.response?xhr.response:xhr.responseText
  res...

axios

前言

axios是一个基于promise的http网络请求库 也是vue.js2.0版本推荐使用的网络请求库

axios默认的一些配置

axios 默认Content-Type为 application/json;charset=UTF-8

get请求

axios.get(url).then().catch()
    axios.get(' url ').then(res=>{
        ...
    }).catch(err=>{
        ...
    })
axios.get(' url ',{ 配置参数 }).then().catch();
    axios.get(' url ',
            { 
                params: {name:'张三'},
                headers:{},
                responseType:'blob'
             }
             ).then(res=>{
                ...
             }).catch(err=>{
                ...
             })

post请求

axios.post(' url ').then().catch
    axios.post(' url ').then(res=>{
                            ...
                        }).catch(err=>{
                            ...
                        });
axios.post(' url ',{ 请求体数据 },{ 配置对象 }).then().catch()
    axios.post(' url ',
                 JOSN.stringify({name:'张三'}),
                 {
                    headers:{},
                    responseType:'blob'
                 }
              ).then(res=>{
                ...
              }).catch(err=>{
                ...
              });

axios封装

request.js:
  import axios from 'axios';
    export function(config){
        const instance=  axios.create({
              baseURL:‘’,
              timeout:‘’  
        })
        return instance;
    }

homeHttp.js:
    import {request} from './request.js
     export function getBanner(params){
              return request({
                              url:'',
                              method:‘get’
                  })
      }

相关对象

qs

qs是将对象序列化与反序列化的工具对象 
npm install qs --save
// 序列化
qs.stringify({ name:'zhangsan',age:20}) ----name=zhangsan&age=20
//反序列化
qs.parse('name=zhangsan&age=20) ---- {name:'zhangsan',age:20}

FormData

a、formData可以快速序列化一个form表单的数据 
  var fm = new FomrData('#form');
  fm.append(key,value);
  fm.get('name')
  ...
b、formData可实现图片二进制异步上传
    var fm = new FomrData();
    fm.append('key1','value1');
    fm.append('avatar',file)
    ...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容