Bug表现:
当小程序开发者后台使用正确的参数调用微信开放平台服务端 API code2Session 时,Response Body 返回了 JSON 内容,但 Response Header 中的 Content-Type 却为 text/plain。要复现该问题,需要向 API 传递完整参数;如果不带参数调用 code2Session,则 Response Header 中的 Content-Type 是 application/json,无法复现问题。
截图中,第一个调用不带参数,此时返回 Content-Type: application/json; encoding=utf-8。第二个调用带上了正确的参数,可以看到 Body 中返回了 JSON 内容,成功获取了 session_key 和 openid,但 Header 中却是 Content-Type: text/plain。
预期表现:
当 Response Body 的内容为 JSON 时,将 Response Header 中的 Content-Type 设为 application/json。(根据 IETF RFC 8259,JSON 默认用 UTF-8 编码,MediaType 不必再加 charset 之类的参数。如果要加,虽然“encoding”语义上可能更准确,但习惯上更常见的是“charset”。但加个 encoding=utf-8 倒也不算错。)
说明:
对于 HTTP 协议而言,Content-Type 不是什么无关紧要的元数据,错误的 Content-Type 会影响一些库对内容的解析。例如,在默认配置下,Spring 框架的 RestClient 遇到 text/plain 时,从 JSON 到 Java 对象的自动转换就无法按正常工作。(如果是在浏览器上,Content-Type 错误还可能导致安全问题。)
社区中已经有不少开发者反馈过 Content-Type 不对的问题:
https://developers.weixin.qq.com/community/develop/doc/0004ee74718d9897fca67d0c35e400
https://developers.weixin.qq.com/community/develop/doc/00088e5987c4c8e1f4eaa9b4c5a400
https://developers.weixin.qq.com/community/develop/doc/000c464f6501d82b074d5f5055b000
https://developers.weixin.qq.com/community/develop/doc/0000447948451076996f93e7e5b000
https://developers.weixin.qq.com/community/develop/doc/0000667e480a685a63b0c8bf666c00
可见此问题已存在多年。希望微信开放平台团队重视此类问题。
另注:建议Bug反馈的“问题模块”分类中加个关于服务端API的选项。