JS中绕过REST直接发送纯字节数据至服务器的可行性咨询
我理解REST的作用是通过添加标头规范发送到服务器的数据,比如REST请求生成的字节流类似:
POST /qwe HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive
末尾再附带用户输入的数据。
现在我在写自定义JS服务器,想咨询:
- 在JS中能不能发送不含REST附加内容(比如标头、请求方法)的纯字节数据?
- 这种方式能不能兼容浏览器,同时符合HTTP协议?
举个例子,我不想发送这种带HTTP结构的内容:
POST /qwe HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive MY DATA OVER THERE!!!
只想发送:
MY DATA OVER THERE!!!
让服务器只读取用户数据。
我搜了下,XMLHttpRequest和fetch都得指定CRUD方法,还会自动添加请求标头。
浏览器端的限制与可行方案
HTTP类API(XHR/fetch)做不到
这两个API本身就是为HTTP协议设计的,必须遵循HTTP请求规范:请求必须包含起始行(方法、路径、HTTP版本)、必要请求头(比如Host是HTTP/1.1强制要求的),所以无论怎么配置,都会附带这些HTTP结构内容,没法只发纯字节数据。用WebSocket实现纯字节传输
如果想在浏览器里发送纯字节数据,可以用WebSocketAPI。它会先通过HTTP握手和服务器建立连接,握手完成后就脱离HTTP协议约束,后续可以直接发送ArrayBuffer、Blob这类纯二进制数据,传输内容里不会有HTTP头、请求方法这类附加信息。但前提是你的自定义服务器要支持WebSocket协议,能处理握手请求和后续的二进制帧解析。原生TCP Socket不可用
出于安全考虑,浏览器没有提供直接操作TCP套接字的原生API,没法直接建立裸TCP连接发送纯字节。
关于HTTP协议兼容性
如果只发送纯字节数据,完全不符合HTTP协议。HTTP协议明确要求请求必须有起始行、请求头,之后才是请求体。纯字节数据没有这些结构,根本不是合法的HTTP请求,普通HTTP服务器也无法解析,你的自定义服务器必须用非HTTP的协议来处理这类数据。
Node.js服务器端的情况
如果是在Node.js环境中发送纯字节数据,不需要受浏览器限制,可以用net模块直接创建TCP套接字,建立连接后发送纯字节流,完全不需要附带HTTP相关的附加内容。
内容的提问来源于stack exchange,提问作者Товарищ Понечка

