记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题
在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务。
恰好为了测试,我写了一个全量用户的生产、测试环境调用接口返回结果进行对比的脚本,于是发现了题中的问题:两个php服务里的接口返回值写入xlsx后,直接copy出来是正常的json串,golang的接口返回值copy出来变成双重引号如图

排查过程:
1、先通过python的requests请求接口直接打印出返回值,看看是否是两个双引号,结果发现php跟go服务都是正常的json串。
2、继续排查,猜想问题会不会出现编码传输格式上,于是对比php跟go接口响应标头。
php服务响应头如下:

go服务应头如下

go跟php响应头的差别只在于两点:php多了TimeStamp,Content-Type里面多了charset=utf-8。
首先排除TimeStamp,从名称上就可以看出来不会对返回值格式或内容有任何影响;
然后尝试用flask编写两个接口,Content-Type里面分别为application/json、application/json; charset=utf-8,写入excel后发现并没有任何不同。
3、响应头也没问题,继续猜想会不会是go服务代码缺陷,接口在return response之前并没有序列化,而是直接返回了object对象?
我们先了解一个概念:序列化与反序列化。
序列化是把程序对象转换为字节序列的过程,反序列化就是把字节序列恢复为程序对象的过程。
因为不同的客户端、服务端可能使用的语言不同,为了兼容都是用序列化之后的数据进行传输,比如前端js将页面参数序列化之后传递给后端java服务。
开始实验,本地flask直接返回字典{"username": username, "password": password},写入excel的居然真的出现了两个双引号。

4、于是让开发排查代码里是不是没有作序列化,但是出人意料的是,go代码里是做了序列化才返回的。
所以上面的猜想都不成立,研究一度陷入僵局,直到...
5、偶然注意到copy出来的返回值尾巴上有个莫名其妙的换行。

根据以前经常写json数据入csv、xlsx文件的经验,就算是格式化后加了多个引号的json数据(例如pandas的to_csv方法里的quoting参数即可控制是否加引号),也不可能加换行符。
所以猜想会不会是返回值多了个隐形的换行符,然后在pacharm的cmd里调一下接口看看,果然go服务返回体尾巴上换行了,而php则不会

6、于是在写入excel之前把返回值rstrip()一下做最后的确认,结果从excel复制出来的数据真的没有多重引号了。
至此,揪出来这个go服务的bug!
记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题的更多相关文章
- django学习-17.如何提供一个规范的接口返回值
目录结构 1.前言 2.进行实际的一个完整流程操作 2.1.第一步:编写一个用于查询用户数据的视图函数 2.2.第二步:编写对应的一个url匹配规则 2.3.第三步:启动django项目[hellow ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
- WebApi 接口返回值类型详解 ( 转 )
使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...
- charles修改接口返回值
我们在测试app时,如果想看大数据量的展示情况,可以通过charles修改接口返回值来实现. 步骤1:手机连接代理 步骤2:app端请求接口,查看charles抓包情况 步骤3:选择想要修改返回值的接 ...
- WebApi接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...
- Asp.Net WebApi接口返回值IHttpActionResult
WebApi是微软在VS2012 MVC4版本中绑定发行的,webapi2.0同mvc5发行的 webapi一共有以下接口返回值 1.void无返回值2.IHttpActionResult Json( ...
- API 接口返回值
API 接口返回值 https://blog.csdn.net/baple/article/details/52925772
- WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型
首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...
- (转)C# WebApi 接口返回值不困惑:返回值类型详解
原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ...
- [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T c ...
随机推荐
- 基于Mindspore2.0的GPT2预训练模型迁移教程
摘要: 这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移. 本文分享自华为云社区<MindNLP-基于Mindspore2.0的GPT2预训练模型迁移教程> ...
- 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2018年发布产品)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商(2018). 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量 ...
- SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
SpringBoot 在Windows运行时,有个黑窗体,容易被不小心选中或关闭,或者服务器重启后,不能自动运行,注册为 Windows Service服务 可实现 SpringBoot 项目在Win ...
- PHP微信三方平台-授权登录
一.逻辑步骤解析 步骤 1:第三方平台方获取预授权码(pre_auth_code) 步骤 2:引入用户进入授权页 第三方平台方可以在自己的网站中放置"微信公众号授权"或者" ...
- java开发技术栈如何选型
前言 2023泰山景区门票免费政策是从1月21日到3月31,今天4.1起不再免费啦,泰山的人.山和系统终于平安的渡劫过去! 洪峰时疯狂的抢票.各类攻击,分销MT两次凌晨抗洪事件,我及其我的团队又一次得 ...
- [网络/Linux]处理安全报告/安全漏洞的一般流程与思路
对近期工作中所经历的4次处理第三方网络安全公司的安全报告及其安全漏洞的经验做一点小结. 1 流程 Stage1 阅读/整理/分类:安全漏洞报告的安全漏洞 (目的:快速了解漏洞规模和分布) Stage2 ...
- [Linux]CPU架构/指令集:RISC / CISC | arm | amd | X86/i386 | aarch64
1 前言 本文是解决在软件开发.软件交付过程中,常常需要找寻与服务器硬件的CPU架构适配的软件包时,开发者和交付者又时常摸不着头脑.[迷迷糊糊]地就下载了某个所谓"适配".&quo ...
- [Linux]U盘启动盘安装CentOS7系统(LiveGNOME版)
1 准备:工具 U盘 容量:视CentOS具体版本需要而定.推荐4G+ UltraISO(软碟通) ISO制作工具 / U盘启动盘刻录工具 2 制作:U盘启动盘 step1 下载CentOS镜像 Ce ...
- 听说你想用免费的FOFA?(第二弹)
听说你想用免费的FOFA?(第二弹) 上回说到 听说你想用免费的FOFA? 第二弹 记得那是一个阳光正好的午后,我刚更新了导出文件类型,到了晚上就发现fofa hack下载不了了,看了一下最新的规则, ...
- openGauss Datakit安装部署
一.问题描述:目前找不到任何关于opengauuss Datakit安装部署的文档,自己来尝试踩坑. DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插 ...