异常 API 结果

你好!

我正在尝试调用 API 以创建新主题。Discourse API Docs

我使用 Postman 发送请求,将 API 密钥、用户名和内容类型作为请求头,并将 JSON 数据放在请求体中。

我已确认 API 用户名和密钥正确无误,但该 API 调用返回的是我们登录页面的 HTML 内容。

这是否是预期行为?有什么解决方法吗?

1 个赞

能否请您粘贴您正在尝试的 API 调用的 cURL 版本?

4 个赞

好的……

curl -X POST 'https://staging-discuss.newrelic.com/posts.json' \
     -H 'Api-Username: RyanVeitch' -i \
     -H 'Api-Key: My-API-Key' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
    "title": "My fancy title",
    "raw": "Some random text to fill my topic",
    "category": 212,
    "created_at": "2020-06-22"
}'

在终端中,我得到以下输出:

HTTP/1.1 307 Temporary Redirect
Proxied-By: Service Gateway
Strict-Transport-Security: max-age=31536000; includeSubDomains
Location: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json
content-type: text/plain;charset=UTF-8
content-length: 138

正在重定向到不同的 URI:https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%
1 个赞

如果还需要我提供任何协助来排查问题,请随时告诉我 :smiley:

看来您使用了一个非常定制的中间代理设置。

这不是 Discourse 的标准行为,因此这似乎是由您的特殊代理引起的。

也许可以发送某个特殊的 Header 来绕过代理?需要查阅该产品的文档确认。

6 个赞

太棒了!谢谢 @Falco,我会和我们的开发团队一起深入研究 :slight_smile:

2 个赞

@Falco,我已经成功通过了代理,但现在遇到了 403 BAD CSRF 错误。

我看到这个讨论帖似乎还没完结……

你对如何解决这些错误有什么建议吗?

2 个赞

我刚刚在本地测试了您的 curl 命令示例,一切正常,因此语法完全正确。是否有可能是代理剥离了某些请求头?这可能导致您收到“BAD CSRF”错误,因为系统无法再读取或访问 API 凭据。

3 个赞

感谢 @blake

我们的代理是完全自定义的内部构建,作为面向公众的前置层。

我已通过 VPN 接入内部网络,当前访问的是后端(代理之后)的 URL,而非公开 URL,因此请求不应经过代理。

我们的测试环境 Discourse 实例版本为 2.3.10。

该版本上的 API 行为是否有所不同?

1 个赞

不,v2.3.10 仍然包含所有基于请求头的认证内容,因此其行为不应有任何不同。

你触发了这一行:

这意味着你的请求格式有误,导致系统无法识别这是一个 API 请求。

2 个赞

由于这是一个预发布实例而非本地环境,请求在到达 Discourse 之前会经过 Nginx 或其他 Web 服务器。根据您的配置,Nginx 可能会剥离某些标头,这些情况可能会在 Nginx 日志中显示。

这是从请求标头中读取 API 凭据的代码行。您也可以在文件中添加一些调试语句,以确认标头是否已传递至此。

4 个赞

@blake

谢谢!我会向我们的开发团队反馈这个问题 :smiley:

感谢您的帮助

1 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.