最近我遇到一些奇怪的问题,使用http标头(Adding multiple custom http request headers mystery)为了避免当时的问题,我已将字段放入json字符串并将该json字符串添加到标头中,而不是将这些字段添加到单独的http标头。
例如,而不是
request.addHeader("UserName", mUserName);
request.addHeader("AuthToken", mAuthorizationToken);
request.addHeader("clientId","android_client");
我创建了一个json字符串并将其添加到单个标题
String jsonStr="{\"UserName\":\"myname\",\"AuthToken\":\"123456\",\"clientId\":\"android_client\"}";
request.addHeader("JSonStr",jsonStr);
由于我刚开始写Rest和处理Http的东西,我不知道我的用法是否合适。我很感激对此有所了解。
部分链接
http://lists.w3.org/Archives/Public/ietf-http-wg/2011OctDec/0133.html
答案 0 :(得分:23)
是,HTTP标头中允许使用JSON。
根据HTTP spec(引用标题格式的ARPA internet messages spec),唯一的限制是您的标题 field-body 必须是ASCII,并且不得包含CR或LF字符(即新行)。
由于几乎所有JSON编码器都将CR和LF字符编码为“\ r”和“\ n”,并且编码非ASCII字符(例如“é”变为“\ u00e9”),因此这不是问题。检查编码器的文档以确定。
上述ARPA规范(RFC 822)对此确切用例进行了特殊描述:
标题的某些字段体可以根据a来解释 某些系统可能希望解析的内部语法。这些领域 被称为“结构化领域”。
此外,RFC 822明确指出没有长度限制:
为了便于阅读,长标题字段的字段 - 主体部分可以是 “折叠”到实际区域的多条线上。 “长”通常是 解释为大于65或72个字符。前者 当要在大多数情况下查看消息时,length用作限制 简单的终端,使用简单的显示软件; 然而,限制 本标准不强制执行。
答案 1 :(得分:6)
一般来说,您不会在REST API的标头中发送数据。如果您需要发送大量数据,最好使用HTTP POST并在请求正文中发送数据。但看起来您正试图在标头中传递凭据,而某些REST API确实使用了这些凭据。这是一个example for passing the credentials in a REST API for a service called SMSIfied,允许您通过Internet发送短信。此示例使用基本身份验证,这是REST API的常用技术。但是,您需要使用此技术的SSL来确保其安全。 Here is an example关于如何使用WCF和REST实现基本身份验证。
答案 2 :(得分:4)
根据我的理解,在header选项中使用json字符串并不像使用HTTP DELETE用于http GET一样滥用,因此甚至有人建议在http头中使用json。当然,仍然欢迎更全面的见解,并且仍然可以接受答案。
答案 3 :(得分:2)
Base64encode 。就像 JSON Web Token 这样做 这是NodeJs示例:
var myJsonStr = JSON.stringify(myData);
var headerFriendlyStr = Buffer.from(myJsonStr, 'utf8').toString('base64');
res.addHeader('foo', headerFriendlyStr);
在您需要阅读时对其进行解码:
var myBase64Str = req.headers['foo'];
var myJsonStr = Buffer.from(myBase64Str, 'base64').toString('utf8');
var myData = JSON.parse(myJsonStr);