AWS-使用带有multipart / form-data的API网关上传CSV文件

问题描述 投票:0回答:1

我有一个用例,我需要通过AWS API Gateway使用AngularJS应用程序将CSV文件上传到我的后端应用程序(在Elastic Beanstalk-Django Python REST App中运行)。

  1. API网关与AWS Cognito集成在一起。
  2. 后端应用程序需要带有CSV上传的表单数据。

我已经通过POST方法使用/ main_resource / upload_csv之类的资源创建了API网关。

[当前,我正在使用示例Javascript应用程序对此进行测试,该应用程序对API网关URL进行AJAX调用。下面是AJAX调用

$.ajax({ method: 'POST', url: 'https://47483nvh39.execute-api.ap-south-1.amazonaws.com/mystage/main_resource/upload_csv', headers: { Authorization: authToken, "Accept": "*/*", "Content-Type": "multipart/form-data" }, contentType: 'multipart/form-data', data: formData, dataType: "json", processData: false, success: completeRequest, error: function ajaxError(jqXHR, textStatus, errorThrown) { console.error('Error: ', textStatus, ', Details: ', errorThrown); console.error('Response: ', jqXHR.responseText); console.log("Status: " + jqXHR.status); if (jqXHR.status == 401 || jqXHR.status == 403) { //redirectToLogin(); } else { alert('An error occured:\n' + jqXHR.responseText); } } });

重要设置在API网关资源POST方法中完成

  1. API网关->设置->二进制媒体类型-添加了'multipart / form-data
  2. 向“方法请求”-“内容类型”和“接受”中添加标题
  3. 已将标题添加到“集成请求”-“内容类型”和“接受”
  4. 向“方法请求”请求正文中添加内容类型作为“多部分/表单数据”
  5. 在“集成请求”中将多部分/表单数据添加到“映射模板”中

完成所有这些设置后,我得到的响应为500“内部服务器错误”。我浏览了Django应用程序的日志,发现未访问后端URL。

对此提供的任何帮助都将受到赞赏

谢谢

Avinash Deshmukh。

javascript amazon-web-services api-gateway
1个回答
0
投票

我终于可以用POST执行multipart/form-data请求以上传CSV。

下面是必需的步骤。

  1. 在API网关中添加二进制媒体类型->设置->二进制媒体类型'multipart / form-data'
  2. 将标题“ Content-Type”和“ Accept”添加到“方法请求”中。
  3. 将“内容类型”添加到“方法请求”->请求正文中,作为“多部分/表单数据”。

  4. 在“集成请求”中,选中“使用代理集成”复选框。

在Ajax调用中,从标题列表中删除“ Content-Type”。可以看出,“ Content-Type”标头是与“请求正文”有效负载一起发送的。因此,修改后的Ajax调用可以是这样的:

$.ajax({ method: 'POST', url: 'https://47483nvh39.execute-api.ap-south-1.amazonaws.com/mystage/main_resource/upload_csv', headers: { Authorization: authToken, "Accept": "*/*" }, contentType: 'multipart/form-data', data: formData, dataType: "json", processData: false, success: completeRequest, error: function ajaxError(jqXHR, textStatus, errorThrown) { console.error('Error: ', textStatus, ', Details: ', errorThrown); console.error('Response: ', jqXHR.responseText); console.log("Status: " + jqXHR.status); if (jqXHR.status == 401 || jqXHR.status == 403) { //redirectToLogin(); } else { alert('An error occured:\n' + jqXHR.responseText); } } });

希望这将帮助那些在集成过程中面临挑战的人。

© www.soinside.com 2019 - 2024. All rights reserved.