我使用React和axios。我正在尝试发送请求:
/* Здесь создаётся объект axios */
const apiRequester = axios.create({
baseURL: 'http://localhost:8080/',
withCredentials: true
});
/* Данный метод должен отправить запрос */
const saveOpenParagraphs = (id, paragraphsToSave) => {
console.log(paragraphsToSave)
return apiRequester.post('programs/' + id + '/open-paragraphs', paragraphsToSave, {
headers: {
'X-XSRF-TOKEN': getXSRFToken()
}
});
}
/* Не имеет прямого отношения к вопросу, но мало ли, вдруг как-то влияет */
const getXSRFToken = () => {
return Cookies.get('XSRF-TOKEN');
}
一个对象paragraphsToSave就是一张地图。这是它在控制台中的外观(在发送请求之前记录):
Map(22) {100007 => 400, 100015 => 900, 100016 => 1000, 100017 => 1100, 100018 => 1200, …}
[[Entries]]
0: {100007 => 400}
1: {100015 => 900}
2: {100016 => 1000}
3: {100017 => 1100}
4: {100018 => 1200}
5: {100019 => 1300}
6: {100020 => 1400}
7: {100021 => 1500}
8: {100022 => 1600}
9: {100023 => 1700}
10: {100024 => 1800}
11: {100027 => 2100}
12: {100028 => 2200}
13: {100029 => 2300}
14: {100030 => 2400}
15: {100031 => 2500}
16: {100032 => 2600}
17: {100033 => 2700}
18: {100035 => 2800}
19: {100036 => 3000}
20: {100037 => 3100}
21: {100038 => 3200}
size: (...)
__proto__: Map
在 masonrynetwork中,请求正文如下所示:
{}
为什么会这样?其余的对象都正常发送(我之前没发卡),但是这里的请求体是空的。怎么修?
为什么 axios 会这样做?(反问)
如果你查看这个库的文档,你会注意到允许的值类型在那里非常明确地列出:
也就是说,没有
Map宣布支持。但是提到了使用配置属性的可能性
transformRequest,它用于修改传递给 axios 方法的请求数据。此属性的描述位于同一文档页面的文本中的较高位置。简而言之:它接受将在发送请求之前调用的回调数组(带有两个参数 - 请求正文,标头对象),并且最后一个回调必须以支持的类型之一返回请求正文的最终值由图书馆 (string | Buffer | ArrayBuffer | FormData | Stream)。开源产品的常用方法:fork项目存储库➝ 实现对库中类型值的支持
Map➝ 确保遵守共同作者指南的所有建议/要求➝ 将 PR 发送给作者。从@yar85的回答中,很明显您需要以某种方式将对象
Map带到string,因为 axios 不会以纯粹的形式感知地图。我的解决方案结果非常简单,尽管它可能不是最优的。但我有一个简单的地图,其中原语充当键和值,所以这个解决方案适合我:
第一个函数
Object.fromEntries将地图作为一个简单对象返回:并
JSON.stringify从对象返回一个字符串。Map您可以在以下来源中阅读有关将对象转换为字符串的不同方法的更多信息:链接、链接、链接。