Исправлено: я изменил несколько вещей в go, поэтому я не могу точно сказать, что решило мою проблему, но в основном: - API нужен int или long, и я отправлял String .. parseInt решен Это. Первоначально я объявил объект данных:
const [data, setData] = useState({
})
Со всеми значениями, которые я собирался отправить позже (и с правильными типами данных! Если я не уверен, кажется, что null довольно хорошо работает для инициализации) , -Другая проблема заключалась в том, что я слил все свои данные в ловушку непосредственно перед моим POST-запросом, поскольку он асинхронный ... это плохая идея. -Наконец, но самое главное, и это, вероятно, было проблемой (благодаря EntiendoNull и JMadelaine), я инициализировал свои данные как [], а не как {}, поэтому я отправлял объект внутри массива .. отсюда JSON parse error: Cannot deserialize instance of
сообщение в API, когда я POST. .---------------------------------------------- -------------------------------------------------- ----------------------------------.
У меня проблема с сообщением запрос не работает должным образом.
По сути, заголовок неверен, он должен быть {"content-type": "application/json"}
Но вместо этого это пустой объект. Вот где я делаю POST:
const [data, setData] = useState([]);
const createMission = async (e) => {
setData({
...data,
nom:state.missionName,
id_client:state.currentClientKey,
id_consultant:state.currentConsultantId,
id_manager:1,
id_ro:state.currentROKey,
id_rc:state.currentRCKey,
detail:state.missionDescription,
adresse:state.adresse,
frequence_eval:6,
date_debut:state.startDate,
date_fin:state.endDate,
metier:state.metier
});
let headers = {
headers: {'Content-Type': 'application/json'}
};
axios.post('http://localhost:8080/mission',data,{"headers" : headers})
.then(res => {
console.log(res);
});
Вот содержимое res на консоли моего навигатора:
{…}
config: Object { url: "http://localhost:8080/mission", method: "post", data: "{\"nom\":\"\",\"id_consultant\":null,\"id_manager\":1,\"detail\":\"\",\"adresse\":\"\",\"frequence_eval\":6,\"date_debut\":null,\"date_fin\":null,\"metier\":null}", … }
data: ""
headers: Object { }
request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
status: 200
statusText: ""
<prototype>: Object { … }
Данные отправляются нормально, я получаю 200 статус назад, но, как вы можете видеть, заголовки содержат пустой объект, а данные представляют собой пустую строку ""
.
Забавно, я делаю почти то же самое с другим компонентом, и он работает просто отлично: в этом случае я даже не указываю заголовки.
const createClient = async (e) => {
axios.post('http://localhost:8080/client', {nom:state.nomClient})
.then(res => {
console.log(res);
});
};
А вот журнал:
{…}
config: Object { url: "http://localhost:8080/client", method: "post", data: "{\"nom\":\"aze\"}", … }
data: Object { id: 372, nom: "aze" }
headers: Object { "content-type": "application/json" }
request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
status: 200
statusText: ""
<prototype>: Object { … }
API такой же, он @RequestBody. Вот для миссии:
@PostMapping
public Mission addMission (@RequestBody MissionBean missionBean){
Optional<Client> optionalClient = clientRepository.findById(missionBean.id_client);
Optional<Consultant> optionalConsultant = consultantRepository.findById(missionBean.id_consultant);
Optional<Utilisateur> optionalManager = utilisateurRepository.findById(missionBean.id_manager);
Optional<Utilisateur> optionalRo = utilisateurRepository.findById(missionBean.id_ro);
Optional<Utilisateur> optionalRc = utilisateurRepository.findById(missionBean.id_rc);
if (optionalClient.isPresent() && optionalManager.isPresent() && optionalConsultant.isPresent() && optionalRo.isPresent() && optionalRc.isPresent()){
Mission newMission = new Mission(
missionBean.nom,
optionalClient.get(),
optionalConsultant.get(),
optionalManager.get(),
optionalRo.get(),
optionalRc.get(),
missionBean.detail,
missionBean.adresse,
missionBean.frequence_eval,
missionBean.date_debut,
missionBean.date_fin,
missionBean.metier
);
missionRepository.save(newMission);
return newMission;
}
return null;
}
и здесь для клиента (2-й пример, который отлично работает):
@PostMapping
public Client addClient (@RequestBody Client client){
clientRepository.save(client);
Critere critere = new Critere(client,"Ponctualité",true);
Critere critere2 = new Critere(client,"Assiduité",true);
Critere critere3 = new Critere(client,"Intégration",true);
critereRepository.save(critere);
critereRepository.save(critere2);
critereRepository.save(critere3);
return client;
}
Я пробовал много разных способов указать заголовки, но это все еще не работает. Запрос работает хорошо (200), но данные не понимаются на стороне API, заголовок отсутствует, поэтому пустая строка в качестве данных, я вроде как новичок в этом, поэтому я застрял здесь. Когда я проверяю свою базу данных, ничего нового не добавляется.
Редактировать: я получаю сообщение от API каждый раз, когда делаю запрос:
2020-02-22 22:19:39.737 WARN 4205 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.evalside.project.beans.MissionBean` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.evalside.project.beans.MissionBean` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 1]]
Может быть, это может помочь решить проблему
Edit2: некоторые из моих значений должны быть int, но приходят как String (только что заметил) Я собираюсь исправить это и попробуйте снова