2013-05-22 1 views
0

Я пытаюсь вызвать веб-службу Hessian из приложения Javascript, но у меня возникают проблемы с анализом ответа, поскольку jQuery обрабатывает ответ как текст и удаление первых байтов. В моем исследовании я выяснил, что вам нужно установить кодировку как 'charset = x-user-defined', чтобы браузер оставил мои байты как есть. Но, по словам Аякса документы:Сила «charset = x-user-defined» на jQuery Ajax Post

Отправка данных на сервер

По умолчанию Ajax запросы посылаются с помощью метода GET HTTP. Если требуется метод POST , метод может быть задан путем установки значения для опции типа. Этот параметр влияет на то, как содержимое параметра данных отправляется на сервер. Данные POST всегда будут , переданные на сервер с использованием кодировки UTF-8, согласно стандарту XMLHTTPRequest W3C .

И действительно, кодировка не меняется независимо от настроек, которые я использовал. Я попытался следующие, отдельно и все сразу, не повезло

$.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");    
     } 
    }) 

Также я пытался возиться с преобразователями данных и пользовательских ContentTypes, определенных в JQuery, без Succes.

Похоже, что согласно стандарту я не смогу это сделать. Он работает с GET, но не с POST, и для протокола Hessian требуется POST.

Есть ли у вас идеи? Или мне нужно, чтобы начать строить свой XHR метод формы нуля?

+0

Вашего вопроса о посланных данных, или ответных данных? Вы писали, что _jQuery обрабатывает ответ как text_, но затем цитирует раздел документации об опубликованных данных. – Barmar

+0

Это правда! Я не заметил, что он говорит «серверу». Моя проблема - чтение данных с сервера. И, я полагаю, поскольку jQuery не хочет изменять заголовок, я не собираюсь получать двоичный ответ, который мне нужен. – FreemanAMG

+0

Способ обработки ответа контролируется опцией 'dataType'. Если вы не укажете 'json',' xml' или 'jsonp', или сервер устанавливает один из них в заголовке ответа' Content-type', я думаю, что он просто возвращает данные дословно как строку. – Barmar

ответ

0

Оказывается, я делал глупую ошибку где-то в другом месте. Но во всяком случае, я нашел приятный способ обработки двоичных данных по запросу и ответам, from here.

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

Надеется, что вы найдете ее полезную

 Смежные вопросы

  • Нет связанных вопросов^_^