首页 > 其他分享 >记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题

记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题

时间:2023-05-18 16:02:03浏览次数:45  
标签:copy 单元格 excel 接口 json go 返回值 序列化 php

在项目里刚好有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!

 

标签:copy,单元格,excel,接口,json,go,返回值,序列化,php
From: https://www.cnblogs.com/archerhzy/p/17412206.html

相关文章

  • java读取excel表格(含有多个sheet)
    publicList<List<List<String>>>uploadExcel(StringfilePath)throwsFileNotFoundException{//两种方式,一种直接上传的文件MultipartFile,一种用本地的文件:FileFilefile2=newFile(filePath);InputStreaminputStream=newFileInputStrea......
  • 03]FlexCel的将DBGrid1导出为Excel
    usesFlexCel.Core,FlexCel.XlsAdapter;procedureDataSetToXLS(XLSX:TExcelFile;DataSet:TDataSet;WorkSheetCount:Integer=1;ActiveSheet:Integer=1);varioldrecno,icol,irow:integer;fmt:TFlxFormat;fmtDateTime:Integer;begin......
  • vb.net 实现excel导入的时候滚动显示导入的数据
     如果你想在Excel导入过程中滚动显示导入的数据,可以使用逐行读取Excel数据并在滚动窗口中显示。在VB.NET中,你可以使用Excel.Range对象逐行读取Excel数据,并将每行数据添加到滚动窗口(如ListBox或TextBox)中进行显示。以下是一个示例代码,展示如何实现逐行滚动显示Exc......
  • Excel中时间戳与标准日期格式的互相转换
    背景在excel中将13位毫秒级别的时间戳转换为标准的日期格式(yyyy-mm-ddhh:mm:ss.000),使用如下模板=TEXT(<source_cell>/1000/86400+70*365+19,"yyyy-mm-ddhh:mm:ss.000")在excel中将10位秒级别的时间戳转换为标准的日期格式(yyyy-mm-ddhh:mm:ss.000),使用如下模板=TEXT(<sou......
  • Scrapy将数据存入excel和MySQL数据库中
    一:Scrapy将爬到的数据存入MySQL数据库中1.导入pymysql第三方库pipinstallpymysql2.连接数据库(itempipeline.py)实现数据库的连接一般分为三个步骤:建立连接,操作数据,提交事务,关闭数据库。基本方法如下:classSpider01Pipeline:#连接数据库def__init__(self):......
  • excel-08-Excel函数由浅入深-Excel函数
    Excel函数填充定义:是Excel中的内置函数,使用时,不区分大小写且每个函数都有其特定的功能和用途结构:以“=”为引导,函数名称开始,后接左括号,然后以逗号分隔输入的参数,最后是右括号。分类:共包含11类,分别是数据库函数,日期与时间函数、工程函数、财务函数、信息函数、逻辑函数、查询......
  • excel-09-Excel函数由浅入深-逻辑函数
    逻辑函数定义:根据指定的条件进行判断,如果一个条件满足,就给出结果。公式描述AND并且(同时满足)OR或者(满足其中一个)IF逻辑判断AND/OR/IF(logical1,[logical2,...])​ logical1必需,需要检验的第一个条件​ logical2可选,需要检验的其他条件......
  • excel-10-Excel函数由浅入深-排序函数
    排序函数函数名意义LARGE从大到小排序SAMLL从小到大排序RANK相同数字排位是1个,紧邻后面数字会跳跃RANK.avg多个值具有相同排位,则返回平均排位RANK.eq多个值具有相同排位,则返回数组最高排位​ Large(Array,K)-Array必选,数组或数组区域-K必选,K......
  • excel-06-Excel函数由浅入深
    Excel函数由浅入深-掌握函数的写法机器基本结构-了解单元格地址的引用以及在函数中的应用-熟练各类函数的作用以及函数的使用场景知识点Excel公式Excel函数逻辑函数统计函数日期函数文本函数排名与排序函数查找与引用函数......
  • excel-07-Excel函数由浅入深-Excel公式
    Excel公式定义:用加减乘除等运算符号,把一些数值、文本、函数等组合在一起,得出一个结果的数学算式。输入方法:手工输入与单元格引入手工输入:在的那远哥输入等号“=”,再输入公式,其中在编辑栏会出现公式具体表达,单元格会显示公式的表达结果。单元格引入:手动输入字符串,但是指定......