I'm trying to convert a small FastAPI web app from JQuery AJAX to Fetch API.
The AJAX call sends some JSON to the server which is run through a function on the backend. The original JQuery code looks like this:
static run_task_one(E1, E2, E3, n1, n2, success, error) {
$.ajax({
url: "/run/task/one",
type: "POST",
data: JSON.stringify({
E1: E1,
E2: E2,
E3: E3,
n1: n1,
n2: n2,
}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: success,
error: error,
});
}
This works fine.
My current implementation using FetchAPI is the following:
static run_task_one(E1, E2, E3, n1, n2, success, error) {
fetch("/run/task/one", {
method: "POST",
body: JSON.stringify({
E1: E1,
E2: E2,
E3: E3,
n1: n1,
n2: n2,
}),
headers: {
contentType: "application/json; charset=utf-8",
},
})
.then((response) => response.json())
}
This returns a 422 error code, along with the message: "value is not a valid dict" in the response. I've checked the response payload for each of the requests and both have the same value:
{"E1":"0.92","E2":"1.1","E3":"1.43","n1":"0.0025","n2":"0.0005"}
I understand FastAPI uses Pydantic, is it related to this package? Is the input provided by Fetch's body parameter different from JQuery's data parameter?
This error was caused by me incorrectly defining the
Content-Typeheader in the fetch request. I usedcontentTypeas the request header, which was copied from the JQuery AJAX implementation.Using this header with Fetch created an extra header type called
contentType, whilstContent-Type, the header I was trying to change, was set to a default value.The default value is
text/html; charset=UTF-8, which doesn't match the"application/json; charset=utf-8"value I'm trying to use. This meant my data was unreadable by FastAPI on the backend.