我正在编写自己的HTTP服务器。我正在使用Java Socket
。我从InputStream
下一种方式阅读请求
val input = BufferedReader(InputStreamReader(socket.inputStream, "UTF-8"))
当我收到来自curl
或浏览器的请求时,一切都很好。但是当我收到Postman
的请求时,我得到这样的东西:
��g�������#���=��g�������#���, ��9� ��3���5�/�=��9� ��3���5�/�,
我尝试使用其他编码来InputStreamReader
例如UTF-16
和ASCII
。邮递员请求使用哪种编码以及如何在服务器上读取它?
更新:对不起,这是我的失败。我在发出请求时使用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之上工作