【发布时间】:2020-02-22 20:55:38
【问题描述】:
已修复: 我一口气改变了一些东西,所以我不能真正说出是什么解决了我的问题,但基本上: -API 需要 int 或 long,我正在发送 String.. parseInt 解决了它。 我最初声明了一个数据对象:
const [data, setData] = useState({
})
对于我稍后要发送的所有值(以及正确的数据类型!如果我不确定,null 似乎对于初始化工作得很好)。 -另一个问题是我在我的 POST 请求之前将所有数据合并到一个钩子中,因为它是异步的..这是一个坏主意。 -最后,但最重要的是,这可能是问题所在(感谢 EntiendoNull 和 JMadelaine),我将我的数据初始化为 [] 而不是 {},所以我在数组内发送一个对象.. 因此@987654322我发布时 API 中的 @ 消息。 .------------------------------------------------ -------------------------------------------------- -------------------------------------------。
我遇到了一个帖子请求无法正常工作的问题。
基本上,表头不对,应该是{"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;
}
这里是给客户的(第二个例子很好用):
@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 的形式出现(刚刚注意到)要修复它并再试一次
【问题讨论】:
-
你已经将你的 headers 对象分层了。 headers 对象有一个名为 headers 的属性,然后包含您的标题。
headers = { headers: { 'Content...。像这样声明它:headers = { 'Content.... -
感谢您的快速回复。我已经尝试过了,它仍然无法正常工作。实际上,我已经尝试了许多不同的方法来实现标题。我担心的是,在我的客户端发布方法中它工作得很好,我不需要指定任何东西,但在这个方法中它不需要,所以我假设问题来自其他地方,也许是 API。
-
另外,您以错误的方式使用状态。您正在设置
data并立即使用它来发送请求,但这不是更新状态的工作方式,因此您的请求中不会包含正确的数据。发送请求前不需要存储状态,发送请求即可。
标签: reactjs spring http-headers axios http-post