Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ошибка 500 fetch (https://javascript.ru/forum/misc/80384-oshibka-500-fetch.html)

BJester 29.05.2020 14:11

ошибка 500 fetch
 
Здравствуйте, возникла проблема. Я написал форму регистрации, которая успешно работает, после чего написал js файл, который обращается к серверу через fetch GET методом и всё ок. Но когда я сделал форму логина и повторил всё уже с методом POST, то сервер выдаёт ошибку 500, причём сама форма логина работает, однако если подключить js файл с fetch то случается error. Есть идеи с чем это может быть связано?
форма логина
<!DOCTYPE HTML>
<html>
<head>
    	<title>Login</title>
</head>
<body>
    	<form method="POST" action="https://test-publicapi.maximarkets.org/Account/logon">
	<p>
		<label>Login<br>
			<input name="email" type="email" size="40" id="log">
		</label>
	</p>
	<p>
		<label>Password<br>
			<input name="password" type="password" size="40" id="pass">
		</label>
	</p>
	<p>
		<button type="submit">Вход</button>
	</p>
	</form>
	<script src="scriptforlog.js"></script>
</body>
</html>

Вот js файл
async function onFormSubmit(evt) {
evt.preventDefault();

let email = document.getElementById('log').value;
let password = document.getElementById('pass').value;
let skip2Fa = true;

let data = new FormData();
data.append('email',email);
data.append('password',password);
data.append('skip2Fa',skip2Fa);

const response = await fetch(`https://test-publicapi.maximarkets.org/Account/logon`, {
method: "POST", body: data
});
if(response.ok) {
alert('ok');
} else {
alert('wrong');
};
}

const form = document.querySelector('form');
form.addEventListener('submit' , onFormSubmit);

Malleys 30.05.2020 02:49

Цитата:

Сообщение от BJester
Есть идеи с чем это может быть связано?

Вы отправляете данные в разных форматах — когда отправляли напрямую через форму, то там был тип application/x-www-form-urlencoded, (такой же, как у текстового представления класса URLSearchParams), что очевидно принимается сервером.

А класс FormData в конечном счёте представляет данные при отправке в виде типа multipart/form-data, а вам нужен application/x-www-form-urlencoded. Можно перевести из одного формата в другой, а можно сразу правильный.

Например, замените (строка №8) FormData на URLSearchParams.

BJester 30.05.2020 13:19

Спасибо, я уже понял что проблема была в формате данных, однако я решил проблему таким способом(добавил headers)
function onFormSubmit(evt) {
evt.preventDefault();

let mail = document.getElementById('log').value;
let pass = document.getElementById('pass').value;

fetch('https://test-publicapi.maximarkets.org/Account/logon', {  
	method: 'POST',
    	headers: {
    		'Accept': 'application/json',
    		'Content-Type': 'application/json'
    	},
    	body: JSON.stringify({
		email: mail,
		password: pass,
	})
});


}
const form = document.querySelector('form');
form.addEventListener('submit' , onFormSubmit);

laimas 30.05.2020 17:09

Цитата:

Сообщение от Malleys
multipart/form-data, а вам нужен application/x-www-form-urlencoded

А чем смешанный тип не подойдет? Статус 500, это в первую очередь нужно смотреть логи на сервере и устранять причину на нем.

Malleys 04.06.2020 01:53

Цитата:

Сообщение от laimas
А чем смешанный тип не подойдет?

Пусть имеется адрес «dimityr.novakov@gmil.com» и пароль «anybody!has@got#to$learn%sometime», которые нужно передать на сервер. Давайте посмотрим, как можно представить эти данные для передачи...
  • multipart/form-data
    Код:

    ------WebKitFormBoundaryfJQTzzfNQvHhuVKC
    Content-Disposition: form-data; name="email"

    dimityr.novakov@gmil.com
    ------WebKitFormBoundaryfJQTzzfNQvHhuVKC
    Content-Disposition: form-data; name="password"

    anybody!has@got#to$learn%sometime
    ------WebKitFormBoundaryfJQTzzfNQvHhuVKC--

  • application/x-www-form-urlencoded
    Код:

    email=dimityr.novakov%40gmil.com&password=anybody%21has%40got%23to%24learn%25sometime
  • application/json
    Код:

    {"email":"dimityr.novakov@gmil.com","password":"anybody!has@got#to$learn%sometime"}

Т. к. передача файлов не нужна в данном случае, то наверно следует отдавать предпочтение менее многословному формату!

Цитата:

Сообщение от laimas
Статус 500, это в первую очередь нужно смотреть логи на сервере и устранять причину на нем.

Многие общественные API могут такое возвращать, однако это скорей означает, что следует посылать данные в правильном формате.

laimas 04.06.2020 07:09

Цитата:

Сообщение от Malleys
однако это скорей означает, что следует посылать данные в правильном формате.

Ой ли так это на самом деле? И остальное ну чушь полнейшая, ибо на то он и смешанный тип, и он никак не может стать причиной ошибки отправки им вместо application/x-www-form-urlencoded.

Malleys 04.06.2020 09:24

Цитата:

Сообщение от Malleys
И остальное ну чушь полнейшая

Какие предъявы? Посчитай байты!

Цитата:

Сообщение от laimas
ибо на то он и смешанный тип, и он никак не может стать причиной ошибки

Конечно же можешь посылать данные во всех возможных форматах, однако разработчики серверного кода могли написать только обработку, например, для типа json, а на всё остальное завершение со статусом 404 или 500 или найди ещё «Я — чайник!» или ещё что!

Цитата:

Сообщение от laimas
на то он и смешанный тип, и он никак не может стать причиной ошибки

«Не хотим принимать такое — завершили как смогли!»

laimas 04.06.2020 09:53

Слушай, гений ты наш, ты практически ответил на возможную причину ошибки тем, что вместо application/x-www-form-urlencoded отдается тип multipart/form-data, что является просто бредом. Все дальнейшие твои рассказы, это пересказ документации, которую я и без тебя знаю.

И хотя бы поинтересовался каковы причины могут порождать статус 500, и корректно ли будет бездумно при этом выплевывать его клиенту, пусть мается в догадках. А то гонишь пургу, баз какой-то беспредметный.

Malleys 04.06.2020 10:26

Цитата:

Сообщение от laimas
И хотя бы поинтересовался каковы причины могут порождать статус 500, и корректно ли будет бездумно при этом выплевывать его клиенту, пусть мается в догадках.

Вам уже отвечали — неверный формат данных запроса. А чём вам не подходит ответ в формате JSON?

Цитата:

Сообщение от laimas
ты практически ответил на возможную причину ошибки тем, что вместо application/x-www-form-urlencoded отдается тип multipart/form-data

Я писал про отправку на сервер в формате multipart/form-data (и автор темы тоже), а не про отправку клиенту, которая кстати, происходит в формате JSON. И отправка клиенту статуса 500, а также сопутствующих данных тоже происходит в формате JSON...
{
	"errorType": 1,
	"statusCode": 500,
	"message": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.",
	"messageDetail": null,
	"validationErrors": null,
	"padString": null
}


Цитата:

Сообщение от laimas
Все дальнейшие твои рассказы, это пересказ документации

Какой пересказ? Даже автор темы давно понял, что «проблема была в формате данных».

laimas 04.06.2020 10:38

Цитата:

Сообщение от Malleys
Вам уже отвечали — неверный формат данных запроса. А чём вам не подходит ответ в формате JSON?

Значит так: если речь об API, то нормальный разработчик обязательно опишет параметры запроса, иначе, что вполне естественно, с API нельзя будет работать. В том что такое случилось скорее вина пользователя не удосужившегося прочесть документацию, и обнаружившего решение методом научного тыка.

Ты же начал совсем с иного, что вообще никоим образом не могло быть источником проблемы. Все остальное, это ради поболтать.

PS. Кстати, отвечать клиенту статусом 404 на ошибку несоответствия типу, это вообще из рук вон.


Часовой пояс GMT +3, время: 17:11.