在Http Header中使用Json字符串

Win*_*tet 20 json http-headers

最近我遇到一些奇怪的问题与http标头使用(添加多个自定义http请求标头神秘)为了避免当时的问题,我已将字段放入json字符串并将该json字符串添加到标头而不是将这些字段添加到单独的http标头.

例如,而不是

request.addHeader("UserName", mUserName);
request.addHeader("AuthToken", mAuthorizationToken);
request.addHeader("clientId","android_client");
Run Code Online (Sandbox Code Playgroud)

我创建了一个json字符串并将其添加到单个标题中

String jsonStr="{\"UserName\":\"myname\",\"AuthToken\":\"123456\",\"clientId\":\"android_client\"}";
request.addHeader("JSonStr",jsonStr);
Run Code Online (Sandbox Code Playgroud)

由于我刚开始写Rest和处理Http的东西,我不知道我的用法是否合适.我希望对此有所了解.

一些链接

http://lists.w3.org/Archives/Public/ietf-http-wg/2011OctDec/0133.html

jch*_*ook 25

是的,HTTP标头中允许使用JSON.

根据HTTP规范(引用标头格式的ARPA互联网消息规范),唯一的限制是您的标题字段主体必须是ASCII,并且不得包含CR或LF字符(即新行).

由于几乎所有JSON编码器都将CR和LF字符编码为"\ r"和"\n",并编码非ASCII字符(例如"é"变为"\ u00e9"),因此这不是问题.检查编码器的文档以确定.

前面提到的ARPA规范(RFC 822)对这个确切的用例有一个特殊的描述:

可以根据某些系统可能希望解析的内部语法来解释标题的某些字段体 .这些字段称为"结构化字段".

此外,RFC 822明确表示没有长度限制:

为了便于阅读,长标题字段的字段 - 主体部分可以"折叠"到实际字段的多行上."长"通常被解释为大于65或72个字符.当在大多数使用简单显示软件的简单终端上查看消息时,前一长度作为限制; 但是,本标准不限制此限制.

  • 你能告诉我,在标头中发送 json 是一个好的做法吗?这两种方法有什么区别?什么时候用哪个? (2认同)

Kev*_*ans 6

一般来说,您不会在REST API的标头中发送数据.如果您需要发送大量数据,最好使用HTTP POST并在请求正文中发送数据.但看起来您正试图在标头中传递凭据,而某些REST API确实使用了这些凭据.下面是一个示例,用于在REST API中为名为SMSIfied的服务传递凭据,该服务允许您通过Internet发送SMS文本消息.此示例使用基本身份验证,这是REST API的常用技术.但是,您需要使用此技术的SSL来确保其安全.以下是如何使用WCF和REST实现基本身份验证的示例.


roc*_*cer 6

发送前对它进行Base64编码。就像JSON Web令牌如何做一样。
这是一个NodeJs示例:

var myJsonStr = JSON.stringify(myData);
var headerFriendlyStr = Buffer.from(myJsonStr, 'utf8').toString('base64');
res.addHeader('foo', headerFriendlyStr);
Run Code Online (Sandbox Code Playgroud)

需要阅读时将其解码:

var myBase64Str = req.headers['foo'];
var myJsonStr = Buffer.from(myBase64Str, 'base64').toString('utf8');
var myData = JSON.parse(myJsonStr);
Run Code Online (Sandbox Code Playgroud)


Win*_*tet 5

据我了解,在 header 选项中使用 json 字符串并不像使用 http DELETE 进行 http GET 那样滥用,因此甚至有人建议在 http header 中使用 json。当然,仍然欢迎更彻底的见解,并且仍然需要给出公认的答案。