邮递员请求编码



我正在编写自己的HTTP服务器。我正在使用Java Socket。我从InputStream下一种方式阅读请求

val input = BufferedReader(InputStreamReader(socket.inputStream, "UTF-8"))

当我收到来自curl或浏览器的请求时,一切都很好。但是当我收到Postman的请求时,我得到这样的东西:

��g�������#���=��g�������#���, ��9� ��3���5�/�=��9� ��3���5�/�,

我尝试使用其他编码来InputStreamReader例如UTF-16ASCII。邮递员请求使用哪种编码以及如何在服务器上读取它?

更新:对不起,这是我的失败。我在发出请求时使用HTTPS。

如果收到的前两个字节是 ASCII 31 (0x1F) 和 139 (0x8B),则您正在接收 GZIP 流,并且出于某种原因说服客户端您支持 GZIP Content-Encoding(与字符集编码不同)。

数据看起来比字符编码更二进制。 应该考虑二进制数据的 Gzip、压缩、SSL 或其他原因。

您可能没有正确进行内容协商,因此收到二进制 gzip 或 deflate。或者使用 HTTPS 与 HTTP。 或上传图片。 有些东西,但不是文本。

注意: 我的另一个答案更直接,这是在 Kotlin 中使用的相关 HTTP 服务器库,以防其他人阅读这个问题并想知道替代方案。 不确定这是否是XY问题,以及作者是否不知道其他选项。

如果您不想构建 HTTP 库,而是使用一个,则其他方法:

原始 HTTP 框架:

  • 任何为 Java 编写的内容,特别是:
  • Undertow.io
  • Vert.x
  • 3 with Vert.x-web
  • 网 - 非常低的水平

比原始HTTP多一些,但不是MVC或REST框架:

  • 芥末 - 科特林特定

对于更完整的 REST 或 Web 框架:

  • KTOR - Kotlin 特定
  • Kovert - 特定于 Kotlin,REST 但添加视图(免责声明:我是作者
  • Spark Java - Java,在 Kotlin 中运行良好
  • Vert.x
  • Nubes - Java,在 Vert.x 之上工作
  • Kikaha - 爪哇,在Undertow之上工作

最新更新