你好!
我正在尝试调用 API 以创建新主题。Discourse API Docs
我使用 Postman 发送请求,将 API 密钥、用户名和内容类型作为请求头,并将 JSON 数据放在请求体中。
我已确认 API 用户名和密钥正确无误,但该 API 调用返回的是我们登录页面的 HTML 内容。
这是否是预期行为?有什么解决方法吗?
你好!
我正在尝试调用 API 以创建新主题。Discourse API Docs
我使用 Postman 发送请求,将 API 密钥、用户名和内容类型作为请求头,并将 JSON 数据放在请求体中。
我已确认 API 用户名和密钥正确无误,但该 API 调用返回的是我们登录页面的 HTML 内容。
这是否是预期行为?有什么解决方法吗?
能否请您粘贴您正在尝试的 API 调用的 cURL 版本?
好的……
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%
如果还需要我提供任何协助来排查问题,请随时告诉我 ![]()
看来您使用了一个非常定制的中间代理设置。
这不是 Discourse 的标准行为,因此这似乎是由您的特殊代理引起的。
也许可以发送某个特殊的 Header 来绕过代理?需要查阅该产品的文档确认。
太棒了!谢谢 @Falco,我会和我们的开发团队一起深入研究 ![]()
我刚刚在本地测试了您的 curl 命令示例,一切正常,因此语法完全正确。是否有可能是代理剥离了某些请求头?这可能导致您收到“BAD CSRF”错误,因为系统无法再读取或访问 API 凭据。
感谢 @blake
我们的代理是完全自定义的内部构建,作为面向公众的前置层。
我已通过 VPN 接入内部网络,当前访问的是后端(代理之后)的 URL,而非公开 URL,因此请求不应经过代理。
我们的测试环境 Discourse 实例版本为 2.3.10。
该版本上的 API 行为是否有所不同?
不,v2.3.10 仍然包含所有基于请求头的认证内容,因此其行为不应有任何不同。
你触发了这一行:
这意味着你的请求格式有误,导致系统无法识别这是一个 API 请求。
由于这是一个预发布实例而非本地环境,请求在到达 Discourse 之前会经过 Nginx 或其他 Web 服务器。根据您的配置,Nginx 可能会剥离某些标头,这些情况可能会在 Nginx 日志中显示。
这是从请求标头中读取 API 凭据的代码行。您也可以在文件中添加一些调试语句,以确认标头是否已传递至此。