位置: 编程技术 - 正文

详解axios在node.js中的post使用(axios使用jsonp)

编辑:rootadmin

推荐整理分享详解axios在node.js中的post使用(axios使用jsonp),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs使用axios,nodejs使用axios,nodejs aes,axios node,axios使用jsonp,axios在vue中的使用慕课笔记,axios main.js,axios main.js,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:

最近因为做的东西需要用到网络请求库,之前接触过的只有request,很强大好用。但是这个项目中需要用到Promise,我又不想重新封装,于是选择了另一款库axios。

在node中,axios的get请求加上原生支持的Promise语法使用起来很方便,很丝滑,但是后面碰到了一个需求,就是要向另一个服务器post数据,并且这个数据是以form-data的形式post过去的,这时,问题就出现了。

问题:

当我想在node中使用axios以post的方式发送一张图片给某个server时,最先我是尝试这样做:

方案一

事实证明,这样做是完全没有用的,我尝试向另一个服务器poststream,返回的总是错误。然而,如果我使用request,下面这样的代码是完全没有问题的:

方案二

探索:

于是,我陷入了思考,WTF!!

我打算简单的写一个服务器,用于打印HTTP请求,然后查看区别(别问我为什么不用抓包工具,任性!),代码呼之欲出:

此时,将url设置为: 这时打印出了这样的结果:

- 上面的是方案一,下面的是方案二

这时可以看出,方案一和二的差别最明显的是content-type,是的,这也是决定了方案一不可行的因素。 既然是content-type导致的,那么方案一PLUS就比较明了了,查阅axios的文档后,我决定手动设置content-type,于是乎:

- 这时,请求是这样的:

貌似差别不大,但我先试着往服务器post数据时,仍然返回错误。实际上这时候没有boundary,文件其实并没有被绑定上去,所以现在仍然没有解决问题。至于boundary,这里有个链接非常能说明问题。

到这里,我们就要耐下心来好好思考了,区别就在于,request中能够设置正确的请求头,那么它是怎么办到的呢,于是我开始翻看request的源码,发现了这一段:

这一段是request在初始化参数中的formData,其中调用了它自身的form()方法,追踪这个函数:

发现了request调用了另一个库form-data,先通过self.form()创建出一个formData对象,再遍历options里的formData项,递归地将内容通过formData的append方法放进去,也就是说是formData实现了post文件,于是乎,我在axios中插入formData,形成了方案三:

方案三:

详解axios在node.js中的post使用(axios使用jsonp)

但是,事实告诉我,我还是悲剧了,请求打印出来是这样的:

再次content-type还是不对,于是我再去翻axios的文档和issue,发现,默认设置的content-type就是application/x-www-form-urlencoded,于是我判断,一定还是要手动设置headers的

于是,基于方案三,我又添加了和改动了这两行形成了方案四:

方案四

但结果还是不理想,直接设置content-type是不行的,因为要将待发送文件绑定,就一定会有boundary出现,另外在方案三和方案四的请求中,出现了transfer-encoding这个值,关于这个chunked,可以参考MDN和这篇文章

一边google一边看文档的我,发现formData的文档中出现过form.getHeaders()的写法,于是方案五出现了:

方案五

但是结果表明,这样还是不行,现在的请求是这样:

但是我目前项目需求是,不使用chunked而采用content-length的方法来传输,这意味着,我要想办法搞到form的长度

在成功案例中,使用requests,于是我翻看了部分源码: 在request/request.js里出现了

它采用Buffer来计算长度,然后添加到headers中去

然后看看在axios里是如何做的: axios/lib/adapters/http.js里出现了

下文并没有出现else,所以,当data是stream的时候,并没有自动设置content-length

所以,我需要在formData.getHeaders()后,再添加一个content-length的key

想要计算长度,自然想到去看看源码,于是在form-data/lib/form_data.js中出现了惊喜:

formData已经封装好了得到长度的方法,只不过它是异步的,不过没关系,在实际项目中,可以将它手动Promise化。最终方案的代码也就自然出现了:

方案六:

这时的请求打印后是这样的:

事实证明它是可以工作的。

更进一步,我们把异步代码Promise一下,得到最终方案:

最终方案

总结

得到一个结论,多多看issue,多多看源码,多多了解基础知识(HTTP协议),对于问题的解决十分重要。最后这一套的实验代码放在github上了,需要研究研究的同学们可以看看:axios-request或者下载到本地学习

好了,

标签: axios使用jsonp

本文链接地址:https://www.jiuchutong.com/biancheng/379435.html 转载请保留说明!

上一篇:node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)(node .js)

下一篇:Nodejs读取文件时相对路径的正确写法(使用fs模块)(nodejs读取文件夹下的所有文件)

  • 公司注册实缴资金能取出吗
  • 汇算清缴补缴企业所得税怎么做账
  • 残保金计入管理费用还是营业税金及附加
  • 发票收款人和复核人、收款人规定
  • 发票专用章盖在收据上有法律效益
  • 制造业三项费用占比行业怎么算
  • 房地产企业售楼降价法律条文
  • 会计账簿按外表形式分
  • 在建工程有应交税费吗
  • 租赁期间怎么算
  • 事业单位上级拨入资金属于什么科目
  • 隐名股东违法吗
  • 营改增后小规模纳税人
  • 一般纳税人的进项税额计入成本吗
  • 企业房租收入营改增
  • 行政事业单位会计基础工作规范
  • 行政事业单位国有资产处置收入包括
  • 分配利润账务处理
  • 对方用房子抵债会计怎么记账
  • 微信收付款认证
  • 企业转让销售配额怎么算
  • 盈余公积转增实收资本要交税吗
  • 基本户和一般户的区别和用途
  • 回收站已损坏 是否清空该驱动,点鼠标无法操作
  • win7系统步骤
  • 360tray.exe损坏文件怎么修复
  • 软碟通支持uefi吗
  • taskhost window
  • 进口应税消费品会计分录
  • drvmgr.exe
  • css合并为单一边框
  • initpki.dll有什么用
  • yii2框架运行原理
  • (二) Vue3 + Element-Plus 实现动态菜单栏
  • 如何利用口诀记单词
  • php转换字符编码
  • 企业破产是不是要没收法人家里全部财产
  • php远程命令执行
  • joomla中文手册
  • 中科院t1
  • 二元运算例子
  • 维修费应该计入什么科目
  • 账实不符的后果和对策
  • 个人工程款结算了对方不付怎么办
  • 文章初审过了
  • pycharm折叠代码块快捷键
  • 其他业务收入与营业外收入
  • sqlserver数据库指定目录
  • 物业广告怎么收费
  • 其他业务成本借方表示什么
  • 一次性医疗补助金怎么计算
  • 小规模纳税人缴纳增值税怎么做账
  • 销售折让的会计分录怎么做
  • 包装成本核算的主要内容
  • 低值易耗品和物料用品的区别
  • 购入土地使用权的,以评估价格为计税依据
  • 购入啤酒会计分录
  • 出口货物不予免税的原因
  • mysql replace正则表达式
  • vb.net invoke
  • win8系统打开软件很慢
  • Linux系统防火墙的命令
  • win8使用技巧 图文
  • ubuntu系统怎么安装微信
  • windows注册账号
  • linux常用命令查看
  • 怎么关闭win10系统
  • addObserver和postNotification函数传递函数的区别
  • 批处理文件是脚本吗
  • cocos2dx环境搭建
  • js 对象内存 占用
  • jquery deferred对象
  • 序列化和反序列化是什么意思
  • linux压缩tar文件命令
  • js解析文本文件
  • jquery将文本框设置为只读
  • Host 'admin-PC' is not allowed to connect to this MySQL server
  • python能不能开发微信小程序
  • js方法不执行
  • 一般纳税人企业所得税5%还是25%
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设