vba - 通过 Rest API 发送 CSV 文件
问题描述
我不是开发人员,但最近一直在使用 VBA、Python 和 AWS 进行大量自动化工作。最近我开始在 AWS 中学习和使用 API。
我一直在尝试通过 REST API 上传 CSV 文件,但它没有按预期工作。
基本上,我已经使用 API Gateway 设置了触发 Lambda 函数将文件上传到 S3 存储桶的 API。
当我在 Postman 中测试我的 API 时,它运行良好,我只需将 Headers 设置为 Key:“Content-Type”和 Value:“application/csv”,然后在 Body 部分我选择“Binary”并浏览我的 csv 文件我想上传。
但问题是当我尝试从我的应用程序(或从 Postman 使用原始文本而不是二进制文件)调用我的 api 时,我正在发送以下正文(也尝试不使用双引号但也不起作用):--data -二进制“\文件位置\文件名.csv”
该 api 返回一个成功代码,但是当我在 S3 中打开文件时,内容是“--data-binary”\file-location\file-name.csv“”,而不是我选择的实际文件的内容。
这是我在我的 VBa 中用来调用 API 的代码:
Dim ws As Worksheet
Dim URL, env, msg, result As String
Dim objHTTP As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
URL = "https://api-url"
msg = "--data-binary ""\\file_location\file_name.csv"""
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "Content-Type", "application/csv"
objHTTP.send (msg)
result = objHTTP.responseText
'getResponse
ws.Range("s3_api_resp").Value = result
Set objHTTP = Nothing
解决方案
应该直接将文件上传到 Amazon S3,我之所以这么说,是因为 AWS Lambda作为调用负载有 6MB的限制。
上传到S3有几种方式,这里有三种方式:
- SDK
- 命令行界面
- 休息 API
没有适用于 VB 的 SDK,但如果您使用的是 VB .Net,则可以使用 .Net SDK。此处提供了一个示例。或者,您可以通过 VB 调用 AWS CLI,这不是那么巧妙(更像是 hack),但可能。详情可在此处获得。或者,您可以使用 AWS S3 Rest API 上传文件,详情请点击此处。
如果存储桶策略允许打开存储桶,则无需凭据即可将文件上传到 Amazon S3。存储桶策略的示例可在此处获得。
如果存储桶被锁定(推荐),那么您应该使用临时凭证上传到 Amazon S3。您可以通过为 PUT 提供预签名 URL来获取临时凭证,也可以使用Amazon Cognito等服务授予临时凭证。Amazon Cognito 由两部分组成,用于存储凭证的用户池和联合/身份池。您可以使用 Amazon Cognito 身份池使用经过身份验证的凭证生成 Amazon Identity and Access Management 的临时凭证。经过身份验证的凭证可以来自Apple、Google、Amazon、Cognito、SAML 和 OpenID。经过身份验证的凭证将交换为 IAM 凭证。IAM _凭据附加到策略,并且该策略应具有上传文件的权限。
推荐阅读
- python - 如何在mysql查询中插入变量
- android - 如何在android编辑文本中收听输入键?
- excel - vb.net 自动化使用来自 OLAP 多维数据集的数据刷新 Excel 文件
- javascript - React Bootstrap Container,子级渲染 2px 高
- sh - POSIX sh 检查(测试)内置 set 选项的值
- python - 同时运行多个 jpynb 文件
- javascript - 如何使用图像触发覆盖
- c# - 如何加载包含来自 HTTP 内容的数据的列表?
- c++ - 从属模板名称和 C++20 ADL
- amazon-web-services - 如何通过 ID 检查 API Gateway 部署内容