如何使用 Axios 将大对象作为字符串发布?

Posted

技术标签:

【中文标题】如何使用 Axios 将大对象作为字符串发布?【英文标题】:How to post large object as a string using Axios? 【发布时间】:2021-09-30 23:18:36 【问题描述】:

我需要能够将一个非常大/非常复杂的对象作为字符串发布,以便我可以立即将它作为服务器上的 json 文件保存到磁盘。当我根本不需要与服务器上的对象交互时,我不想将它映射到 C# 中的对象然后右转并将其序列化到磁盘。

问题是,有时字符串会破坏帖子。为了解决这个问题,我们曾经在JSON.stringify 之后使用encodeURI 字符串,但后来我们必须在C# 中使用HttpUtility.UrlDecode。这对某些数据有一些不必要的后果(比如它删除了一些 html 属性中的图像 src 属性的 dataurls 内的加号)。我们如何才能将对象作为字符串发布而不会出现错误或不需要的副作用?

或者...有没有办法将其作为对象发布,然后在 C# 中将其作为通用对象接收,无需先将其映射到类即可进行序列化?

var data = 
    workflowID: workflowToSave.ID,
    jsonWorkflow: JSON.stringify(workflowToSave)
;

vm.axiosPost("/Workflows/Save", data).then((result) => 
    
) ...

【问题讨论】:

【参考方案1】:

我发现使用window.btoa() 可以安全地发布此属性。

var data = 
   workflowID: workflowToSave.ID,
   jsonWorkflow: window.btoa(JSON.stringify(workflowToSave))
;

然后在c#中你可以将它转换回这样的字符串:

var bytes = Convert.FromBase64String(jsonDocument);
jsonDocument = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
jsonDocument = JsonPrettify(jsonDocument);

然后我可以直接将其保存到文件中。

【讨论】:

【参考方案2】:

我最初使用的是 btoa(请参阅我的其他答案),它在大多数情况下都可以正常工作,但仍然存在一些小问题,因此我将其切换为使用 base64-js,现在一切正常。实现起来简单直接。

【讨论】:

以上是关于如何使用 Axios 将大对象作为字符串发布?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKit 将大对象作为 JSON 发布

将大字符串写入文件的最佳方法

React,如何在 axios 请求的对象中对数组进行包含

使用 Axios 将对象从 React.js 发布到 PHP

如何使用实验性 API 将大文件写入 Blobstore?

如何有效地将大字符串从 Python 传递到 C++ 扩展方法?