Использование строки Json в заголовке Http

Недавно я столкнулся с какой-то странной проблемой с использованием заголовка http (загадка добавления нескольких пользовательских заголовков http-запроса). Чтобы избежать проблемы в то время, я поместил поля в строку 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

Ответ 1

Из того, что я понимаю, используя строку json в опции заголовка, не столько злоупотребление, сколько использование http DELETE для http GET, поэтому даже было предложение использовать json в http-заголовке. Конечно, более глубокие идеи по-прежнему приветствуются, и принятый ответ все еще должен быть дан.

Ответ 2

Да, вы можете использовать JSON в HTTP-заголовках.

Согласно спецификации HTTP, вам нужно только убедиться, что ваше поле заголовка содержит только видимые символы ASCII, табуляцию или пробел и не должно содержать символы CR или LF (т.е. Новые строки, кроме как через устаревшие "складывающиеся пробелы").

Поскольку почти все кодеры JSON будут кодировать символы CR и LF как "\ r" и "\n", а также кодировать невидимые или не-ASCII-символы (например, "é" становится "\ u00e9"), вам не нужно беспокоиться об этом. Проверьте документы для вашего конкретного кодировщика или проверьте его.

Исходная спецификация ARPA (RFC 822) имеет специальное описание этого точного варианта использования, и дух этого отразится в более поздних спецификациях, таких как RFC 7230:

Некоторые полевые тела заголовков могут интерпретироваться в соответствии с внутренним синтаксисом, который некоторые системы могут захотеть проанализировать.

Кроме того, RFC 822 и RFC 7230 явно не дают ограничений по длине:

HTTP не устанавливает предопределенного ограничения на длину каждого поля заголовка или на длину раздела заголовка в целом, как описано в разделе 2.5.

Ответ 3

Вообще говоря, вы не отправляете данные в заголовке для REST API. Если вам нужно отправить много данных, лучше всего использовать HTTP POST и отправить данные в теле запроса. Но похоже, что вы пытаетесь передать учетные данные в заголовке, которые используют некоторые REST API. Вот пример передачи учетных данных в API REST для службы под названием SMSIfied, которая позволяет отправлять текстовые сообщения SMS через Интернет. В этом примере используется базовая аутентификация, которая является распространенным методом для API REST. Но вам нужно будет использовать SSL с этой техникой, чтобы сделать его безопасным. Вот пример того, как реализовать базовую аутентификацию с WCF и REST.

Ответ 4

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);