API Gateway - 来自 Postman 的 200 响应,来自应用的 500

Posted

技术标签:

【中文标题】API Gateway - 来自 Postman 的 200 响应,来自应用的 500【英文标题】:API Gateway - 200 response from Postman, 500 from app 【发布时间】:2022-01-21 10:34:12 【问题描述】:

我在 AWS API Gateway 上有一个 API,它接受 POST 请求并将标头和正文转发给第三方 API 并返回结果。当我从 Postman 发送请求时,此过程工作正常,但不能通过 cURL 或 javascript 工作。

注意 - 下面的所有 URI、身份验证令牌等都已修改,因此屏幕抓取之间可能不一致。

Postman 中的请求如下

这个的邮递员控制台看起来像

POST https://dsvdvsdvsdrc.execute-api.eu-west-1.amazonaws.com/Prod/
200
957 ms
Network
Request Headers
Authorization: Basic <myauthtoken>NTAwYTQxNDdmYzcyLWFkZDgtNDZmMy05ZWU0LWQzYWM=
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Cache-Control: no-cache
Postman-Token: 9dab6f01-67bf-4611-8d8e-c3d5fe725067
Host: tsfsfsdrc.execute-api.eu-west-1.amazonaws.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 82
Request Body
grant_type: "client_credentials"
scope: "https://api.ebay.com/oauth/api_scope"

在我的 JavaScript 应用程序中,我有以下代码:

var data = qs.stringify(
  'grant_type': 'client_credentials',
 'scope': 'https://api.ebay.com/oauth/api_scope' 
 );
 var config = 
   method: 'post',
   url: 'https://fddgdgddrc.execute-api.eu-west-1.amazonaws.com/Prod/',
   headers:  
     'Authorization': 'Basic sssscyLWFkZDgtNDZmMy05ZWU0LWQzYWM=', 
     'Content-Type': 'application/x-www-form-urlencoded'
   ,
   data : data
 ;
 console.log("******Here is ebayData REQUEST***** "+ JSON.stringify(config));
 axios(config)
 .then(function (response) 
   console.log("******Here is ebayData***** "+ JSON.stringify(response.data));
 )
 .catch(function (error) 
   console.log( "******Here is ebay Error***** "+ error);
 );

但是,当应用程序运行时,我收到 500 响应。以下是请求中发送的请求标头和正文

我在 API 上启用了 cloudwatch 日志,下面是通过 Postman 成功请求的示例

这是一个来自浏览器的不成功请求的示例

进一步查看失败和成功响应的响应标头,我发现带有 cmets 的标头是不同的

请求失败

(d360923b-eff2-433f-8f76-a9038547dcdf) Endpoint response headers: rlogid=t6ldssk67%3D9whhldssk67*qc1qr%28rbpv6710-17dd35648ce-0x129, 
x-ebay-c-version=1.0.0, 
x-frame-options=SAMEORIGIN, 
x-content-type-options=nosniff, 
x-xss-protection=1; mode=block, 
set-cookie=ebay=%5Esbf%3D%23%5E;Domain=.ebay.com;Path=/; Secure,dp1=bu1p/QEBfX0BAX19AQA**6581b87b^;Domain=.ebay.com;Expires=Tue, 19-Dec-2023 15:36:27 GMT;Path=/; Secure, 
content-encoding=gzip, 
cache-control=private, <--- doesn't appear in successful response
pragma=no-cache,   <--- doesn't appear in successful response
date=Sun, 19 Dec 2021 15:36:26 GMT, 
server=ebay-proxy-server, 
x-envoy-upstream-service-time=19, 
x-ebay-pop-id=UFES2-RNOAZ03-api, 
transfer-encoding=chunked

请求成功

(fe565553-3283-4593-8b07-b4e2d58dd2a6) Endpoint response headers: rlogid=t6ldssk67%3D9vjdldssk67*5cddm%28rbpv6775-17dd23fa53c-0x124, 
x-ebay-c-version=1.0.0, 
x-ebay-client-tls-version=TLSv1.2,<--- doesn't appear in failed response
x-frame-options=SAMEORIGIN, 
x-content-type-options=nosniff, 
x-xss-protection=1; mode=block, 
set-cookie=ebay=%5Esbf%3D%23%5E;Domain=.ebay.com;Path=/; Secure,dp1=bu1p/QEBfX0BAX19AQA**65817126^;Domain=.ebay.com;Expires=Tue, 19-Dec-2023 10:32:06 GMT;Path=/; Secure, 
content-encoding=gzip, 
content-type=application/json,<--- doesn't appear in failed response 
date=Sun, 19 Dec 2021 10:32:06 GMT, 
server=ebay-proxy-server, 
x-envoy-upstream-service-time=96, 
x-ebay-pop-id=UFES2-SLCAZ01-api, 
transfer-encoding=chunked

我想我已经研究这个太久了,可能遗漏了一些明显的东西,但是标题和正文等似乎在整个应用程序和 Postman 中都是一致的,所以我很困惑为什么来自一个人的请求是成功的另一个失败了。非常感谢任何建议。

【问题讨论】:

您是否查看了实际的原始请求并进行了比较?我的意思是使用像 Fiddler 这样的东西,而不是显示它的粗略表示的东西。 只能使用 postman 生成所需的 js 代码。试试看 另外,您正在显示 OPTIONS 请求的日志(可能是预检),而不是第一种情况下的 POST。 @CherryDT 我以前没听说过 Fiddler,谢谢,我去看看。重新检查飞行前日志,很好。我现在用实际请求更新了问题 @Ryker 我显示的代码是 Postman 生成的代码。最初我有自己的代码来调用它,但在绝望中切换到 Postman 生成的代码 【参考方案1】:

像在 Postman 中一样添加所有其他标头,某些应用程序会拒绝没有适当的用户代理标头或其他一些必需标头的请求。

【讨论】:

非常感谢您的回答。我已经尝试过了,不幸的是它没有任何区别

以上是关于API Gateway - 来自 Postman 的 200 响应,来自应用的 500的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postman 中过滤来自 Docusign Rest API 的报告结果

获取问题-不支持的方法:在测试 API Gateway API 时在邮递员中获取

无服务器框架 AWS REST API Gateway - 403 CORS 错误

使用来自 REST 客户端 Postman 的 AWS_IAM 和 API 密钥对 AWS API 网关进行身份验证

来自Postman的回复显示200,但Android返回403

带有 JWT 身份验证实现的 Django GraphQL API 仍然允许来自 Postman 的未经身份验证的请求获取数据。我该如何解决?