2017-02-02 15 views
1

Можно ли получить «сырой» (текст/данные) из XMLHttpRequest ответа, если responseType был динамически установлен json перед отправкой запрос?JavaScript XHR - получить необработанные данные ответа на не-200 статусе, если responseType был установлен как JSON

Я полагаю, что это может быть сделано условно с другим запросом на тот же URL-адрес с overrideMimeType, но это может быть неразумно - в отношении журналов сервера или любых других процессов.

Вот пример:

var xhr = new XMLHttpRequest(); 
 

 
xhr.open('GET','/some/path.wtf'); 
 
xhr.responseType = 'json'; 
 

 
xhr.onloadend = function() 
 
{ 
 
    if (this.status !== 200) 
 
    { 
 
    console.log(this.response); // null 
 
    // send the response-text to an error handler .. sigh :(
 
    return; 
 
    } 
 
}; 
 

 
xhr.send();

В реальном коде моего проекта, запрос о «/ папки/путь /» рассматривается как запрос JSON а сервер отвечает JSON; если не была проблема, или была вызвана процедура client.console.log() для отладки/тестирования.

Любой вход будет оценен, спасибо.

+1

Вы прочитали документацию по MDN? https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest – epascarello

+0

Спасибо, epascarello, действительно :) – argon

ответ

0

Ниже приведено решение проблемы; Однако, это обходным бут может быть полезным для других, стоящих перед той же проблемой:

var pth,ext,rsp,xhr; 
 

 
pth = '/some/path/'; 
 
rsp = ((path.substr(-1) == '/') ? 'json' : 'blob'); // for example 
 
xhr = new XMLHttpRequest(); 
 

 
xhr.patchJSON = ((rsp == 'json') ? 1 : 0); 
 
xhr.open('GET',pth); 
 
xhr.responseType = ((rsp == 'json') ? 'text' : rsp); 
 

 
xhr.onloadend = function() 
 
{ 
 
    if (this.status !== 200) 
 
    { 
 
    console.log(this.response); // response-text from server 
 
    // send the response-text to an error handler .. yayy :) 
 
    return; 
 
    } 
 

 
    if (this.patchJSON) 
 
    { 
 
    rsp = JSON.parse(this.response); 
 

 
    if ((rsp === null) && (this.response.trim().length > 0)) 
 
    { 
 
     console.log('json syntax error in: '+pth); 
 
     // send `rsp` to the error handler 
 
     return; 
 
    } 
 
    } 
 

 
    // handle blobs/markup/etc, -or: 
 
    console.log(rsp); 
 
}; 
 

 
xhr.send();