目录

  • 裸写http body服务报body Unexpected end of multipart data的解决办法
  • 抛出异常:
  • 抓包
  • 解决问题
  • 附C#调用腾讯OCR营业执照识别的部分源码
  • 总结

裸写http body服务报body Unexpected end of multipart data的解决办法

抛出异常:

  • 案例 调用腾讯OCR营业执照识别报错。
调用腾讯OCR识别时签名没有问题,图片base64也没有问题,但是确收到对方服务报“内部错误”,经过联系沟通,内部错误报:
“caught error Error: Unexpected end of multipart data”

抓包

通过抓包如下:

POST https://recognition.image.myqcloud.com/ocr/bizlicense HTTP/1.1
Content-Type: multipart/form-data; boundary=----------8d7055498b35e31
Authorization: yzo1HrKzdUF2rmYpiRoF482vvglhPTEyNTE3OTMwODAmYj10ZW5jZW50eXVuJms9QUtJRGExRDhtQmdBbEVWWWFSemp6emg5S0l6UWl2eTJDZUJUJmU9MTU2NTMzOTcxOSZ0PTE1NjI3NDc3MTkmcj0xOTA3MTAxNjM1JnU9MCZmPQ==
Host: recognition.image.myqcloud.com
Content-Length: 249
Expect: 100-continue------------8d7055498b35e31
Content-Disposition: form-data; name="appid";1251793080
------------8d7055498b35e31
Content-Disposition: form-data; name="image"; filename="yyzz.jpg"
Content-Type: image/jpeg----------8d7055498b35e31--

解决问题

乍看上面抓包好像没有什么问题,难道是Authorization加密出错?图片base64出错?

其实真正出错的的原因是Content-Type里面的横线要比body里面的少两个。body的最后一定要有两个横线结尾,并且body的横线多少要一致(这个也是最重要的,不是有横线就可以了)。

  • 能正确运行的包应该如下:
POST https://recognition.image.myqcloud.com/ocr/bizlicense HTTP/1.1
Content-Type: multipart/form-data; boundary=----------8d7055498b35e31
Authorization: yzo1HrKzdUF2rmYpiRoF482vvglhPTEyNTE3OTMwODAmYj10ZW5jZW50eXVuJms9QUtJRGExRDhtQmdBbEVWWWFSemp6emg5S0l6UWl2eTJDZUJUJmU9MTU2NTMzOTcxOSZ0PTE1NjI3NDc3MTkmcj0xOTA3MTAxNjM1JnU9MCZmPQ==
Host: recognition.image.myqcloud.com
Content-Length: 249
Expect: 100-continue------------8d7055498b35e31
Content-Disposition: form-data; name="appid";1251793080
------------8d7055498b35e31
Content-Disposition: form-data; name="image"; filename="yyzz.jpg"
Content-Type: image/jpeg------------8d7055498b35e31--

附C#调用腾讯OCR营业执照识别的部分源码

        static void IdentityBusinessLicense(string url){HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(url));Stream memStream = new MemoryStream();webReq.Method = "POST";string boundary = "----------" + DateTime.Now.Ticks.ToString("x");// 边界符  webReq.ContentType = "multipart/form-data; boundary=" + boundary;//webReq.ContentType = "multipart/form-data;";byte[] enter = Encoding.ASCII.GetBytes("\r\n");  //换行memStream.Write(enter, 0, enter.Length);Dictionary<string, string> dic = new Dictionary<string, string>(){{"appid",OCRConfig.appid}};//写入文本字段string inputPartHeaderFormat = "--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"{0}\";" + "\r\n\r\n{1}\r\n";foreach (var kv in dic){string inputPartHeader = string.Format(inputPartHeaderFormat, kv.Key, kv.Value);var inputPartHeaderBytes = Encoding.ASCII.GetBytes(inputPartHeader);memStream.Write(inputPartHeaderBytes, 0, inputPartHeaderBytes.Length);}var fileStream = new FileStream("yyzz.jpg", FileMode.Open, FileAccess.Read);// 写入文件  string imagePartHeader = "--" + boundary + "\r\n" +"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +"Content-Type: image/jpeg\r\n\r\n";var header = string.Format(imagePartHeader, "image", "yyzz.jpg");var headerbytes = Encoding.UTF8.GetBytes(header);memStream.Write(headerbytes, 0, headerbytes.Length);var buffer = new byte[1024];int bytesRead;while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0){memStream.Write(buffer, 0, bytesRead);}// 最后的结束符  byte[] endBoundary = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");memStream.Write(endBoundary, 0, endBoundary.Length);// webReq.ContentLength = memStream.Length;webReq.Headers.Add(HttpRequestHeader.Authorization, OCRApi.HmacSha1Sign());webReq.Host = OCRConfig.Host;var requestStream = webReq.GetRequestStream();memStream.Position = 0;memStream.CopyTo(requestStream);HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);var ret = sr.ReadToEnd();sr.Close();response.Close();requestStream.Close();memStream.Close();}

总结

1、Content-Type: multipart/form-data; boundary=----------8d7055498b35e31 这里header的boundary横线要比body的少两个
2、------------8d7055498b35e31 body里面的横线要比header的横线要多两个且所有body的横线长度要一致,不是有横线就可以了。
3、特别注意结尾处应该还有两个“--”,注意是两个横线
4、还有一点就是要注意header之间,header与body之间,body与body之间的字段相隔多少个“\r\n”,这样就可以了。

转载于:https://www.cnblogs.com/zh672903/p/11168559.html

裸写http body服务报body Unexpected end of multipart data的解决办法相关推荐

  1. mysql服务启动报错:“服务读取描述失败,错误代码:2”的解决办法?

    mysql服务启动报错:"服务读取描述失败,错误代码:2"的解决办法? 这个问题是mysql的服务被损坏了,需要重建服务,不需要重新安装mysql,方法步骤如下 第1步:删除已有的 ...

  2. 码云git push报错 DeployKey does not support push code 解决办法

    码云git push报错 DeployKey does not support push code 解决办法 首先生成公钥去码云添加公钥有具体教程 添加公钥 一顿操作之后测试一下 git push 嗯 ...

  3. 微服务架构中的雪崩问题产生原因及解决办法

    微服务架构中的雪崩问题产生原因及解决办法 参考文章: (1)微服务架构中的雪崩问题产生原因及解决办法 (2)https://www.cnblogs.com/panchanggui/p/10330924 ...

  4. Mint-UI 报错提示缺少“raf.js / vue-lazyload / vue-popup” - 解决办法

    Vue项目运行mint-ui组件,报错提示缺少"vue-popup" ,如何解决? 有时候还会报错提示:··· (比如 raf.js / vue-lazyload / vue-po ...

  5. Sublime Text 2报 Decode error - output not utf-8 错误的解决办法

    Sublime Text 2报"Decode error - output not utf-8"错误的解决办法 作者:chszs,转载需注明. 作者博客主页:http://blog ...

  6. 组件服务-计算机-我的电脑出现红色向下箭头的解决办法

    组件服务-计算机-我的电脑出现红色向下箭头的解决办法 2007-08-18 01:06 在"服务"里找到这三个服务,都启动就行了 Distributed Transaction C ...

  7. 关于C++报错:“表达式必须含有常值”的解决办法

    关于C++报错:"表达式必须含有常值"的解决办法 解决方法: 一维数组: #include <iostream> using namespace std;int mai ...

  8. c++: 已经声明过变量,依然报 C2065:未声明的标识符错误 解决办法

    问题:已经声明过变量,依然报 C2065:未声明的标识符错误 解决办法 问题分析:已经声明过变量,依旧报错未声明的标识符错误 (大家是不是很郁闷!!!),仔细观察两种情况的"=", ...

  9. 部署hexo遇到报错ERROR Deployer not found: git的解决办法

    部署hexo遇到报错ERROR Deployer not found: git的解决办法 今天部署hexo的时候遇到一个报错 hexo c && hexo g && h ...

最新文章

  1. 我在ChinaUnix上看到的有点点用的帖子
  2. ITK:按标量乘以图像
  3. 阿里新晋CNCF TOC委员张磊:“云原生”为什么对云计算生态充满吸引力?
  4. java基础 Unsafe
  5. Spring Boot:快速启动MVC
  6. 如何跨越线程调用窗体控件?(3)
  7. Jersey框架简单实践(一)
  8. excel合并两列内容_你真的会用Excel“数据合并”吗?学会这4招准点下班
  9. Java版Spring Cloud B2B2C o2o鸿鹄云商平台--概述
  10. python hook微信_GitHub - 15993248973/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
  11. 幻想战姬PVP模拟器(二)
  12. Luogu3387 缩点
  13. Android——新大陆云平台篇
  14. 计算机音乐怎么把音乐放u盘,怎么把音乐拷贝到u盘
  15. 产品经理 - 产品设计方法论业务落地部分_包括流程产品文档方法论需求设计方法论
  16. Max导Unity Humanoid模型
  17. Centos curl ssl 替换 NSS 为 OpenSSL
  18. 人工智能与深度神经网络,人工智能的实现路径是
  19. ubuntu下右键无法打开终端(open in terminal)的解决办法
  20. 关于域名解析的问题--对话

热门文章

  1. Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
  2. 高维空间中椭圆的基本方程
  3. App Inventor 微数据库记录分数并排序
  4. android金额大小写转换,Java/android 金额 数字转成大写汉子
  5. 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)
  6. jbpm 历史查询笔记
  7. 记录:手机邮箱格式验证
  8. input标签绑定click事件无反应
  9. MUI click事件无效 click没反应 click监听不到
  10. EXCEL数据改动自动标记功能怎么实现