Reputation: 1094
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?
Upvotes: 1
Views: 211
Reputation: 1094
This error was caused by me incorrectly defining the Content-Type
header in the fetch request. I used contentType
as the request header, which was copied from the JQuery AJAX implementation.
Using this header with Fetch created an extra header type called contentType
, whilst Content-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.
Upvotes: 1