首页 > 解决方案 > 通过 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

标签: vbaapirestcurlaws-api-gateway

解决方案


应该直接将文件上传到 Amazon S3,我之所以这么说,是因为 AWS Lambda作为调用负载有 6MB的限制。

上传到S3有几种方式,这里有三种方式:

  1. SDK
  2. 命令行界面
  3. 休息 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 _凭据附加到策略,并且该策略应具有上传文件的权限。


推荐阅读