加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

post提交数据提示400 Client Error:Bad Request问题解析

(2018-03-06 13:13:16)
标签:

it

分类: 电脑知识积累
问题:
post提交xml数据到接口,大部分数据ok,但是总会有几个产品的数据提交时,接口总是返回400,Bad request
分析:
因为接口程序是一套,所以首先看提交的数据有什么不同。经过反复测试发现提交异常的数据会包含特殊字符,譬如:≥ ≤  °等。自然首先想到的方法就是做字符替换,但是需要替换的字符太多,无法彻底解决问题。
分析根本原因:post的数据中包含了接口无法识别的字符,导致接口无法识别数据,所以只能返回400,说你的url有问题。
后来的思路是找一下post数据不允许存在的字符,get,post提交的数据确实需要把+ % 中文字符等进行urlcode转义,转义为%××的形式。
后来经过各种尝试,经过同事提醒突然发现会不会是编码问题?
果断将提交的数据转为utf-8格式再提交,果然没有再报错了。
原因分析:
使用的django系统默认编码是unicode,而接口接收的数据必须是utf-8的,而且因为提交的数据都是英文的,所以对大部分数据来说unicode和utf-8除了位数不同,其他信息相同,所以不会报错,但是一旦包含特殊字符,unicode和utf-8的编码方式就不一样了,就会报错。
深度分析:
计算机系统通用的字符编码工作方式:
内存中,统一使用unicode编码。
需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
举个例子:
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
再举个例子:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器
编程语言中字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。
如果在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes
python中unicode字符串表示方法 u'ABC',字节('bytes')内容表示方法b'ABC'
python中以Unicode表示的str通过encode()方法可以编码为指定的bytes,注意原数据一定要是unicode的编码格式。
举例:u'ABC112我爱你'.encode('utf-8')
python中要把bytes变为str,就需要用decode()方法。
延伸-字符编码:
计算机只能处理数字,文本必须转换为数字才能处理.
ASCII编码:最早的计算机使用8个比特(bytes)表示一个字节,最多能编码2的8次方,也就是255个。而美国佬把他们的大小写英文字母、数字和一些符号共127个字符编码,称之为ASCII编码。
GB2312:中国的汉字编码,至少需要2个字节。
Unicode:把所有语言都统一到一套编码里.最常用的是用两个字节表示一个字符。
unicode是16个bytes,ascii是8个bytes,ascii转为unicode只需要前面的8个bytes填充0就行了。
utf-8:如果内容都是英文那么unicode就要多一倍的空间,所以为了节省空间utf-8诞生了。把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节
总结:
网络上传输的数据都是utf-8的格式,通常你感觉不到,因为一般的系统的默认字符编码就是utf8格式的,如果传输过程中遇到了错误,一定要检查一下字符编码是否一致。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:我的2017总结
后一篇:我的2018总结
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有