Принудительно использовать "charset=x-user-определенный" в jQuery Ajax Post
Я пытаюсь вызвать гессенский веб-сервис из приложения Javascript, но у меня возникают проблемы с синтаксическим анализом ответа, поскольку jQuery обрабатывает ответ как текст и удаляет его первые байты. В своем исследовании я обнаружил, что вам нужно установить кодировку как "charset=x-user-fined", чтобы браузер оставил мои байты как есть. Но, согласно документации AJAX:
Отправка данных на сервер
По умолчанию запросы Ajax отправляются с использованием метода GET HTTP. Если требуется метод POST, метод можно указать, установив значение для параметра типа. Этот параметр влияет на то, как содержимое параметра данных отправляется на сервер. Данные POST всегда будут передаваться на сервер с использованием кодировки UTF-8 в соответствии со стандартом W3C XMLHTTPRequest.
И действительно, кодировка не меняется независимо от настроек, которые я использовал. Я попробовал следующее, отдельно и все сразу, без удачи
$.ajax({
type : 'POST',
url : url,
timeout : 3000,
data : parameters,
contentType : "x-application/hessian; charset=x-user-defined'",
mimeType: 'text/plain; charset=x-user-defined',
headers: {
Accept : "text/plain; charset=x-user-defined",
"Content-Type": "text/plain; charset=x-user-defined"
},
beforeSend : function(xhr) {
xhr.overrideMimeType("text/plain; charset=x-user-defined");
}
})
Также я попытался возиться с конвертерами данных и пользовательскими типами контента, определенными в jQuery, но безуспешно.
Похоже, что по стандарту я не смогу это сделать. Он работает с GET, но не с POST, а протокол Hessian требует POST.
Есть ли у вас какие-либо идеи? Или мне нужно начать строить мой метод XHR с нуля?
1 ответ
Оказывается, я совершил глупую ошибку где-то еще. Но, во всяком случае, я нашел замечательный способ обработки двоичных данных по запросу и ответам отсюда.
define(function() {
// Do setup work here
function configurationException(message) {
throw new Error(message + " missing from configuration object");
}
return {
post : function(config) {
if (config) {
var url = config.url || configurationException("url");
var done = config.done || configurationException("callback function");
var timeout = config.timeout || 10000;
var data;
if (config.data) {
data = config.data;
} else {
data = null;
console.warn('No data is specified in binaryPost');
}
var request = new XMLHttpRequest();
request.open("POST", url, true);
request.responseType = "arraybuffer";
request.setRequestHeader("Content-Type", "x-application/hessian;");
request.onload = function(oEvent) {
var arrayBuffer = request.response; // Note: not oReq.responseText
if (arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
done(byteArray);
}
};
request.send(data);
} else {
throw new Error("Configuration object is missing");
}
}
};
});
Надеюсь, что вы найдете ее полезной