Ajax ошибка синтаксического анализа xml некорректно

I am running a simple website that communicates with a TestServlet using ajax and jquery. The servlet gives a JSON object using doGet(), as follows:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String json = "{"name": "jsontest","type":"jsonobject"}";
    response.getWriter().append(json);
}

When a button is pressed on the page, an ajax request is issued as follows:

$.ajax({
 type: "GET",
 url: "test",
 data: "",
 dataType: "json",
 success: function(reply) { window.alert("Successn"+reply); },
 error: function(err) { window.alert(err); }

});

The request obtains success, but reply is null and I get from web console:

XML Parsing Error: not well-formed
Location: http://localhost:8585/web/test
Line Number 1, Column 1: {"name": "jsontest","type":"jsonobject"}

I tried to specify mimeType: "applicationjson" but I got the same behavior. Instead, when I don’t specify dataType or I put contentType: "json" I succeed to read correctly the JSON string but still I get the XML Parsing Error.

Can anyone explain why I get a XML Parsing Error while I am supposing to exchange JSON?

NOTE: I’m using Firefox and Tomcat9.

Thank you in advance.

Использую XMLHttpRequest языка JavaScript. Загружаю текст из локального файла. Всё грузится и работает отлично, но Firefox в консоль выдаёт ошибку:

Ошибка синтаксического анализа XML: ошибка синтаксиса
Адрес: file:///C:/путь_к_файлу/название_файла.glsl
Строка 1, символ 1:

Понятно что XMLHttpRequest задуман для XML файлов и проверяет их синтаксис, а у меня файл с текстом шейдера где нет тегов вообще.
Можно в JavaScript коде как то отловить эту ошибку или отключить в самом Firefox?

Воспроизвести ошибку можно так

ajax = function (url) {
  xhr = new XMLHttpRequest()
  xhr.open('GET', url, false)
  xhr.send()
  return xhr.responseText
}
console.log(ajax('shader.glsl'))


  • Вопрос задан

    более трёх лет назад

  • 4457 просмотров

Узнал что есть уже во всю используемый Метод fetch: замена XMLHttpRequest прочитал о нем эту статью, понял что он работает на Promise тут почитал, которые нужны для асинхронного кода которого я так боялся из-за катострофической нечитаемости по сравнению с синхронным кодом с его колбеками и промисами, решил всё таки посмотреть в чем вообще различается синхронный и асинхронный код, попал на статью JavaScript: методы асинхронного программирования обрадовался параграфу Async/await в самом конце. Понял что сегодня не нужны не какие коллбэки, промисы и их цепочки с страшными реализациями функций. Сегодня есть только Async и Await, в глазах никаких колбеков, промисов и неразберихи. Ты просто ставишь Await перед той переменной которую нужно подождать и Async перед функцией в которой эта переменная и она остаётся на том же месте где и синхронный код. После этого желание использовать ещё когда либо XMLHttpRequest отпало напрочь.
Сделал код асинхронным, подстроил fetch под Async и Await, всё, ajax в пару строчек.

async_ajax = async function (ссылка) {
  return (await fetch(ссылка).catch(function(e) { console.log(e.message) })).text()
}

Красота

Пригласить эксперта

Посмотрите какие заголовки выдает сервер при отдаче файла shader.glsl, скорее всего достаточно исправить их.


  • Показать ещё
    Загружается…

03 июн. 2023, в 19:30

500 руб./за проект

03 июн. 2023, в 19:30

750 руб./в час

03 июн. 2023, в 19:06

2000 руб./за проект

Минуточку внимания

Студворк — интернет-сервис помощи студентам

Доброго всем времени суток.
Нужно забацать страничку используя AJAX+PHP на которой бы было поле ввода и пара строчек текста.
При этом на сервер должен периодически отправляться запрос сопоставляющий введенный в поле текст с хранящимся на сервере. По мене редактирования поля ввода под ним должен меняться текст: 1-приглашение к вводу, 2-соответствие не найдено, 3-соответствие найдено.
Собственно задача представлена в книге Дари.К «Разработка динамических веб-приложений»
При попытке запуска книжного кода ловлю следующее:
Ошибка синтаксического анализа XML: некорректно
Адрес: http://localhost/ajax/qstart/q… ame=sdcsdd
Строка 1, символ 34:

Подскажите плз где может быть зарыта собака?

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html PUBLIC "//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>AJAX и PHP: Quickstart</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script type="text/javascript" src="./js.js"></script>
</head>
<body onload='process()'>
Сервер желает узнать ваше имя:
<input type="text" id="myName" />
<div id="divMessage"></div>
</body>
</html>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var xmlHttp = createXmlHttpRequestObject();
function createXmlHttpRequestObject()
{
    var xmlHttp;
    if(window.ActiveXObject)
    {
        try
        {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e)
        {
            xmlHttp = false;
        }
    }
    else
    {
        try
        {
            xmlHttp = new XMLHttpRequest();
        }
        catch (e)
        {
            xmlHttp = false;
        }
    }
// вернуть созданный объект или вывести сообщение об ошибке
    if (!xmlHttp)
        alert("error while creating: XMLHttpRequest.");
    return xmlHttp;
}
 
// выполнить асинхронный запрос HTTP с помощью объекта XMLHttpRequest
function process()
{
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
    {
        var name = encodeURIComponent(document.getElementById("myName").value);
        alert('name: ' + name);
        xmlHttp.open("GET", "quickstart.php?name="+name, true);
 
        xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
 
        xmlHttp.onreadystatechange = handleServerResponse;
        xmlHttp.send(null);
    }
    else
        setTimeout('process()', 1000);
}
 
// вызывается автоматически по прибытии сообщения от сервера
function handleServerResponse()
{
    if (xmlHttp.readyState == 4)
    {
        if (xmlHttp.status == 200)
        {
            var xmlResponse = xmlHttp.responseXML;
            alert(xmlHttp.responseXML.documentElement.firstChild.data); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
            var xmlDocumentElement = xmlResponse.documentElement;
            var helloMessage = xmlDocumentElement.firstChild.data;
            document.getElementById("divMessage").innerHTML = '<i>' + helloMessage + '</i>';
            setTimeout('process()', 5000);
 
        }
        else
        {
            alert("error while querring to server " + xmlHttp.statusText);
        }
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
header("Content-type: text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF8" standalone="yes"?>';
echo '<response>';
$name = $_GET['name'];
$userNames = array('CRISTIAN', 'BOGDAN', 'FILIP', 'MIHAI', 'YODA');
if (in_array(strtoupper($name), $userNames))
echo 'hello, master ' . htmlentities($name) . '!';
else if (trim($name) == '')
echo 'what is your name? ';
else
echo htmlentities($name) . ', I do not know you';
echo '</response>';
?>

#jquery #ajax #firefox

#jquery #ajax #firefox

Вопрос:

Я использую jQuery Ajax, как показано ниже:

 $.ajax({
url: 'servlet/*****Servlet',
      dataType: "text",
      success: function(data) {
        var subareaCoordsPGs = preprocessCoords(data);
      }
    });
  

он работает хорошо, даже если я не установил тип данных в Chrome, однако в FF произошел сбой с ошибкой синтаксического анализа XML.

Исходный
сервер заголовка ответа Apache-Coyote / 1.1
с фрагментированной передачей
Дата Вт, 04 октября 2011 00:08:08 GMT
Исходный
хост заголовка запроса localhost:8080
User-Agent Mozilla / 5.0 (Windows NT 5.2; WOW64; rv: 7.0.1) Gecko / 20100101 Firefox / 7.0.1
Принимает текст / обычный,/; q = 0.01
Принять-язык en-us, en; q = 0.5
Принять-Кодировка gzip, выкачать
Accept-Кодировка ISO-8859-1, utf-8; q = 0.7,; q = 0.7
Соединение поддерживается
по запросу X-с помощью реферера XMLHttpRequest
http://localhost:8080 /
*/
Кэш-Контрольный максимальный возраст = 0

Ошибка синтаксического анализа XML: неправильно сформирован Местоположение: moz-nullprincipal:{2f6a8381-b987-448b-88c2-e89c4e13440b} Номер строки 1, столбец 4:

534@151.248078368847 -33.9353900931769,151.247877472978
-33.9360784582012,151.24…
——^

после поиска я знаю, что хорошо установить правильный тип данных, я хочу, чтобы он анализировался так же, как обычный текст, но почему интеллектуальное предположение не работает в FF, даже если я явно установил его тип «текст»?

Комментарии:

1. Обратите внимание, что даже если вы получите это сообщение, ваш успешный вызов может быть запущен с данными. Последняя версия firefox может жаловаться, но затем все равно продолжить, или, по крайней мере, в моем случае Firefox 55 сделал. Это сообщение об ошибке некоторое время служило для меня отвлекающим маневром, поскольку я предполагал, что это фатально.

2. @J.Allen: Я сталкиваюсь с той же проблемой. Я вижу эту проблему в последней версии firefox. Есть идеи по ее устранению?

Ответ №1:

Ваш сервер не возвращает тип содержимого, поэтому Firefox предполагает, что, поскольку это _XML_HttpRequest, ваш ответ может быть XML и пытается его проанализировать. Когда это не удается, он прекращает попытки и сообщает, что это все-таки не XML.

Chrome, вероятно, делает то же самое, но ничего не сообщает.

Я предлагаю фактически отправить заголовок Content-Type, указывающий, каковы ваши данные.

Комментарии:

1. спасибо за подсказки. я установил тип содержимого text / plain;charset=UTF-8 с помощью jQuery Ajax, например, установил параметр ContentType: «text / plain; charset= UTF-8», и он по-прежнему работает для Chrome, но не для FireFox

2. @qc999 Я понятия не имею, что делает jQuery. Вызывает ли он overrideMimeType для объекта XHR?

3. @qc999 заголовок запроса — это не вопрос. Вопрос в том, каков заголовок ответа для Content-Type . И ваш сервер не отправляет его. Поэтому XHR возвращается к предположению, что это XML, если не указано иное overrideMimeType .

4. @ Boris Zbarsky спасибо за помощь, я обнаружил, что ошибки все еще существуют. но если я установлю тип данных «текст», FireFox сможет его проанализировать. Даже некоторые Gson по-прежнему необходимо анализировать как обычный текст.

5. Чтобы установить правильный тип содержимого, я установил config в Appache или в .htaccess: AddType text / plain .hbs (все * .hbs должны поставляться с текстом типа содержимого.) Firefox был доволен.

Ответ №2:

Просто добавьте этот код. Проблема в том, что сервер не указал тип mime, и firefox принимает его за xml. Этот код укажет, каким Mime-типом будет ответ xhr.

 beforeSend: function(xhr){  xhr.overrideMimeType( "text/plain; charset=x-user-defined" );},
  

Комментарии:

1. Или немного короче: :beforeSend: function(xhr){ xhr.overrideMimeType( "text/plain; charset=utf-8" );},

i am unable to get the response from ajax. please guide me how to resolve this error, i am getting successful data return from the server i have checked it in fiddle web debugger and still ajax is showing error.
XML Parsing Error: no element found Location: moz-nullprincipal:{6b0a1ac2-50ab-4053-9f71-8ae49202288d} Line Number 1, Column 1:

            $j.ajax({

            type:"POST",
            url:'http://www.w3schools.com/webservices/tempconvert.asmx/CelsiusToFahrenheit',
            data: 'Celsius=12',
            crossDomain:true,
            async: false,
            success:function(response)
            {
                alert("Success Full Done"+response.string);
            },
            beforeSend: function( xhr ) {
 xhr.overrideMimeType( 'text/plain; charset=UTF-8' );
}

        });

Vinoth Krishnan's user avatar

asked Jun 5, 2013 at 6:25

Hamid's user avatar

2

I’ve this problem with request:

$.ajax({
    type: "POST",
    url: ajaxUrl,
    dataType : "json",
    contentType: "application/json",
    data: JSON.stringify(data),
    success: function (data) {
         ...
    }
});

Accept header in request is:

Accept  application/json, text/javascript, */*; q=0.01

Response status is 200, but browser detect error and no success callback called

Fixed by remove dataType : «json»:

$.ajax({
    type: "POST",
    url: ajaxUrl,
    contentType: "application/json",
    ...

The only difference that accept header in request changed to:

Accept  */*

But now success callback is called.

answered Apr 22, 2015 at 21:14

Grigory Kislin's user avatar

Grigory KislinGrigory Kislin

16.4k10 gold badges123 silver badges195 bronze badges

Add the «beforeSend» function into your AJAX call to override the acceptable response mime type.

Refer to the jQuery.ajax() documentation:
http://api.jquery.com/jquery.ajax/

As of jQuery 1.5.1, the jqXHR object also contains the overrideMimeType() method (it was available in jQuery 1.4.x, as well, but was temporarily removed in jQuery 1.5). The .overrideMimeType() method may be used in the beforeSend() callback function, for example, to modify the response content-type header:

$.ajax({
  url: "http://fiddle.jshell.net/favicon.png",
  beforeSend: function( xhr ) {
    xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
  }
})
  .done(function( data ) {
    if ( console && console.log ) {
      console.log( "Sample of data:", data.slice( 0, 100 ) );
    }
  });

And:

Data Types

Different types of response to $.ajax() call are subjected to different kinds of pre-processing before being passed to the success handler. The type of pre-processing depends by default upon the Content-Type of the response, but can be set explicitly using the dataType option. If the dataType option is provided, the Content-Type header of the response will be disregarded.

answered Oct 24, 2017 at 21:49

Kenny's user avatar

KennyKenny

214 bronze badges

I had the same problem when I made GET XMLHttpRequest call.

var req = new XMLHttpRequest();
req.open('GET', '/exampleServlet', false);
req.send(null);

It was fixed by setting ContentType on the HttpServletResponse.

 response.setContentType("text/plain");

answered Jun 21, 2017 at 14:20

Hopecee's user avatar

1

This error may be caused due to two reason. One is when getting no response from java backend and other is when their is no @ResponseBody in java Controller method.

answered May 18, 2018 at 5:53

avneet kaur's user avatar

I added ContentType to ResponseEntity and problem solved. Try to add a valid ContentType to your controller response:

ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).build();

answered Oct 23, 2018 at 14:46

sparse's user avatar

sparsesparse

1411 silver badge4 bronze badges

I just ran into the same problem with a simple request:

$.ajax({
    type: "POST",
    url: something,
    data: JSON.stringify(data),
    contentType: "application/json"
});

In my case, this was a fire-and-forget scenario — I don’t care about the response. To solve it, it was a case of changing the server-side code to correctly return a 204: No content status code, instead of returning 200: OK.

answered Oct 2, 2020 at 19:39

John H's user avatar

John HJohn H

14.4k4 gold badges41 silver badges74 bronze badges

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ajax failed ошибка
  • Ajax error вывод ошибок
  • Aitecs 2016 коды ошибок
  • Aisuite3 exe ошибка приложения

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии