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