Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Json string in the Http Header

Recently I run into some weird issue with http header usage ( Adding multiple custom http request headers mystery) To avoid the problem at that time, I have put the fields into json string and add that json string into header instead of adding those fields into separate http headers.

For example, instead of

request.addHeader("UserName", mUserName); request.addHeader("AuthToken", mAuthorizationToken); request.addHeader("clientId","android_client"); 

I have created a json string and add it to the single header

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

Since I am new to writing Rest and dealing with the Http stuff, I don't know if my usage is proper or not. I would appreciate some insight into this.

Some links

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

like image 286
Win Myo Htet Avatar asked Mar 20 '12 00:03

Win Myo Htet


People also ask

What are headers JSON?

Content-Type: application/json is just the content header. The content header is just information about the type of returned data, ex::JSON,image(png,jpg,etc..),html. Keep in mind, that JSON in JavaScript is an array or object.

What should be included in HTTP header?

HTTP headers let the client and the server pass additional information with an HTTP request or response. An HTTP header consists of its case-insensitive name followed by a colon ( : ), then by its value. Whitespace before the value is ignored.

What is the appropriate Content-Type header for HTTP messages that contain JSON in their bodies?

JSON has to be correctly interpreted by the browser to be used appropriately. text/plain was typically used for JSON, but according to IANA, the official MIME type for JSON is application/json .

Why is JSON used in HTTP?

JavaScript Object Notation (JSON) is a platform-independent data transfer format. JSON is popular thanks to its simplicity and human-readability. Its advantages include platform independence and unified format, at the cost of data volume.


2 Answers

Yes, you may use JSON in HTTP headers, given some limitations.

According to the HTTP spec, you MUST ensure that your header field-body contains only visible ASCII characters, tab, or space, and must not contain CR or LF characters (i.e. new lines, except via obsolete "folding whitespace").

Since many JSON encoders (e.g. json_encode in PHP) will encode both CR and LF characters as "\r" and "\n", and encode invisible or non-ASCII characters (e.g. "é" becomes "\u00e9"), you often don't need to worry about this.

Check the docs for your particular encoder or test it, though, because JSON strings technically allow most any Unicode character. For example, JSON.stringify() does not escape multibyte Unicode, by default. However, you can easily modify it to do so, e.g.

var charsToEncode = /[\u007f-\uffff]/g; function http_header_safe_json(v) {   return JSON.stringify(v).replace(charsToEncode,     function(c) {       return '\\u'+('000'+c.charCodeAt(0).toString(16)).slice(-4);     }   ); } 

Source

Alternatively, you can do as @rocketspacer suggested and base64-encode the JSON before inserting it into the header field (e.g. how JWT does it). This makes the JSON unreadable (by humans) in the header, but ensures that it will conform to the spec.


Worth noting, the original ARPA spec (RFC 822) has a special description of this exact use case, and the spirit of this echoes in later specs such as RFC 7230:

Certain field-bodies of headers may be interpreted according to an internal syntax that some systems may wish to parse.

Also, RFC 822 and RFC 7230 explicitly give no length constraints:

HTTP does not place a predefined limit on the length of each header field or on the length of the header section as a whole, as described in Section 2.5.

like image 194
jchook Avatar answered Sep 20 '22 19:09

jchook


Base64encode it before sending. Just like how JSON Web Token do it.
Here's a NodeJs Example:

const myJsonStr = JSON.stringify(myData); const headerFriendlyStr = Buffer.from(myJsonStr, 'utf8').toString('base64'); res.addHeader('foo', headerFriendlyStr); 

Decode it when you need reading:

const myBase64Str = req.headers['foo']; const myJsonStr = Buffer.from(myBase64Str, 'base64').toString('utf8'); const myData = JSON.parse(myJsonStr); 
like image 22
rocketspacer Avatar answered Sep 18 '22 19:09

rocketspacer