Отправка специальных символов в Ajax POST и JSON

@РЕШЕНО

Как объяснил Джеймс М. Лей, я должен изменить свой тип контента с application/x-www-form-urlencoded на application/json.

это подразумевает ошибку, потому что кажется, что только типы UrlEnconded генерируют массивы POST на стороне сервера (по крайней мере, в PHP). Поэтому мне пришлось изменить способ получения/обработки запроса в моем серверном скрипте.

$json = file_get_contents('php://input'); //yes. php://input

if($json) $params = json_decode($json,true);
else $params = $_POST;

Мне также пришлось внести несколько изменений в код Javascript, чтобы проверить тип содержимого и сгенерировать разные строки. Если это JSON, я просто использую JSON.stringify

//string to use in the 'send' method
this.getParametersString = function(){
        if(this.contentType == 'application/json'){
            return JSON.stringify(this.parameters);
        }else{}
}

у меня вопрос

Я создаю функцию, которая получает параметры, чтобы написать список параметров и отправить его POST

Проблема в том, что мы не можем отправлять специальные символы, такие как +

Поэтому я попытался использовать функцию encodeURIComponent, чтобы закодировать их в строку, удобную для URI.

Возникает еще одна проблема: если полученный параметр является объектом, я перебираю атрибуты, проверяя, является ли это другим объектом или строкой, если это объект, повторяю цикл снова, иначе кодирую его.

Но он возвращает объект закодированных строк. Я должен сделать объект строкой, чтобы отправить его, и для этой цели я использую JSON.stringify. Он декодирует закодированную строку. Таким образом, %2B снова становится + и не отправляется на сервер через POST.

с другой стороны, если я сначала использую stringify, а encodeURIComponent он генерирует такие знаки, как "и {}, которые не следует кодировать, а строка не является хорошо написанным JSON

Как ты это делаешь? Это способ без использования jQuery? Должен ли я создавать свою собственную функцию stringify?!


person Victor Ferreira    schedule 23.08.2014    source источник
comment
Почему бы не объединить все параметры в один и отправить его? Формат POST не должен зависеть от аргументов. stringify в JS и парсить на сервере.   -  person Rudie    schedule 24.08.2014
comment
Пропустите encodeURIComponent вообще. JSON, естественно, может обрабатывать специальные символы, а JSON.stringify() автоматически позаботится о большинстве крайних случаев. Причина, по которой вы хотели бы encode отправить POST, заключается в том, что сервер ожидает application/x-www-form-urlencoded. Поскольку ваш сервер ожидает JSON, вы можете просто отправить обычный JSON вверх по линии.   -  person James M. Lay    schedule 24.08.2014
comment
@JamesM.Lay, может быть, в этом и есть смысл. application/x-www-form-urlencoded это то, что у меня есть в моем Content-type. надо ли менять!? я попытаюсь   -  person Victor Ferreira    schedule 24.08.2014
comment
Семантически правильный заголовок типа контента здесь — application/json, но вы также можете использовать text/plain.   -  person James M. Lay    schedule 24.08.2014
comment
@JamesM.Lay, кажется, возникла новая проблема. Я изменил свой код, и теперь он использует application/json в качестве типа контента по умолчанию. Я вижу, что в заголовках отправляются специальные символы (только что проверенный + плюс), но кажется, что сервер не доступен. Я получаю пустой ответ. но если я вернусь к application/x-www-form-urlencoded, он будет работать нормально (я получаю строку JSON). есть какое-нибудь представление о том, что происходит?   -  person Victor Ferreira    schedule 24.08.2014
comment
Лучше всего в этой ситуации проверить консоль javascript. Нажмите F12 в большинстве браузеров (я думаю, что это команда-i на Mac). Это может быть ошибка запроса CORS.   -  person James M. Lay    schedule 24.08.2014
comment
Да, я знаю это. пустой ответ с application/json и строкой JSON (как и ожидалось) с application/x-www-form-urlencoded. то же самое происходит, если я использую что-либо, что не является допустимым типом контента. поэтому кажется, что application/json по какой-то причине не работает на моем сервере (скорее всего) или в браузере   -  person Victor Ferreira    schedule 24.08.2014
comment
[ссылка ниже может вам помочь](stackoverflow.com/questions/19548395/) stackoverflow.com/questions/19548395/   -  person Shaik Matheen    schedule 25.10.2016


Ответы (1)


я использую следующее, и у меня нет проблем

encodeURIComponent(JSON.stringify(object_to_be_serialised))
person King Loui    schedule 23.08.2014
comment
когда у меня есть такой объект, как {number:1}, и я преобразую его в строку, он сгенерирует строку следующего вида {number:1}. если экранировать эту строку, она генерирует другую строку с измененными кавычками и фигурными скобками. но их не стоило менять - person Victor Ferreira; 24.08.2014