frisby.js синтаксис содержимого сообщения
У меня есть пользовательский интерфейс и обмен данными с сервером, который работает хорошо, но я хотел начать тестировать новую разработку с Frisby.js. Пользовательский интерфейс имеет менеджер форм JavaScript, который использует jQuery. Моим телом запроса является объект JavaScript, который сначала сериализуется с помощью JSON.stringify.
var msg = {form:"login",data{username:"elmer",password:"wabbit"}};
var json_msg = JSON.stringify(msg);
Затем он отправляется с помощью jQuery:
$.ajax(
url: baseUrl+"forms/"+call,
data: { req: json_msg },
type: "POST",
success: function(msg){...
Необработанное содержимое тела, полученное на сервере, выглядит следующим образом:
req=%7B%22form%22%3A%22login%22%2C%22data%22%3A%7B%22username%22%3A%22elmer%22%2C%22password%22%3A%wabbit%22%7D%7D
Поскольку этот необработанный основной контент является тем, что мой сервер ожидает и успешно использует, я попробовал несколько комбинаций заголовков типов содержимого и форматов содержимого, но Frisby.js подавляет их или отправляет неправильное тело.
ПРИМЕЧАНИЕ: 1. Сначала сообщение (объект JavaScript) должно быть сериализовано. 2. Затем req=[serialized_message] должен быть закодирован URI. Эти два шага легко выполняются с помощью jQuery.ajax(), но на Frisby.js кажется невозможным
Я пытался: использовать несериализованный объект JavaScript, используя сериализованный объект JavaScript и сериализованный и кодированный URI-текст (показано здесь)
msg = "%7B%22form%22%3A%22login%22%2C%22data%22%3A%7B%22username%22%3A%22elmer%22%2C%22password%22%3A%wabbit%22%7D%7D";
frisby.create('Login on HHHLEG web site.')
.addHeader('X-Requested-With', 'XMLHttpRequest')
.post('http://hhhleg/forms/login', req=msg )
Приведенный выше код ничего не заканчивается в теле, когда он попадает на сервер. Я подозреваю, что есть какая-то простая проблема синтаксиса или проблема типа контента, или Frisby.js не может выполнить комбинацию сериализации и кодирования URI, потому что это душит вовлеченные символы.
2 ответа
Фрисби, вероятно, ожидает тело запроса в кодировке JSON, а не значение по умолчанию в jQuery application/x-www-form-urlencoded
,
Попробуйте установить contentType
:
$.ajax({
url: baseUrl+"forms/"+call,
data: { req: json_msg },
type: "POST",
contentType: "application/json",
// other properties...
});
В аналогичном вопросе мне помогает следующее:
1. Создайте переменную с нужным именем (в вашем случае это "req") и отправьте ее с содержимым сообщения
2. Используйте не обычный пост-конструктор frisby js, а следующий:
...
frisby.create('Send valid data in post')
.post(YourPath,
req, //before it we need to assign to it value by
//"var req = msg" or any byte array
{
json: false,
headers: {
"content-type": "application/octet-stream",
"Authorization": your.authToken //if needed
}
})
.expectStatus(200)
...
В моем случае я пытался отправить байтовый массив изображений, но столкнулся с аналогичной проблемой, связанной с URL-кодированным сообщением и запросом отправки в JSON-форме.
Если это не помогает или кажется, что это не ваш случай - вы можете посетить страницу https://github.com/vlucas/frisby/tree/legacy-0.x/examples для получения дополнительных примеров запроса POST с отправкой данных.