Использование строки Json в заголовке Http - PullRequest
18 голосов
/ 20 марта 2012

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

Ответы [ 4 ]

24 голосов
/ 31 октября 2016

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

В соответствии с HTTP-спецификацией вам нужно только убедиться, что ваш заголовок field-body содержит только видимые символы ASCII, табуляцию или пробел и не должен содержать символы CR или LF (т.е. новые строки, кроме как через устаревшие «складывающиеся пробелы»).

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

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

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

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

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

6 голосов
/ 20 марта 2012

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

4 голосов
/ 04 ноября 2016

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);
4 голосов
/ 25 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...