You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby调用IBM Tone Analyzer服务遇认证问题:不知凭据放置位置

解决IBM Tone Analyzer Ruby HTTP请求的"no credentials supplied"问题

我之前对接Watson服务时也踩过这个一模一样的坑!IBM Tone Analyzer这类服务默认用HTTP基本认证来校验身份,根本不是把凭据塞请求体或者URL参数里——这就是你一直收到错误响应的核心原因。

为啥curl能正常跑?

你用curl能成功,是因为-u username:password这个参数会自动帮你生成符合要求的Authorization请求头,而你手动写Ruby请求时完全没处理这个关键环节,服务端自然识别不到你的凭据。

Ruby里的正确实现方式

直接给你可复用的代码示例,用Ruby标准库Net::HTTP就能搞定:

require 'net/http'
require 'base64'
require 'json'

# 替换成你自己的服务端点URL(注意实例ID和版本号要和控制台一致)
tone_uri = URI('https://api.us-south.tone-analyzer.watson.cloud.ibm.com/instances/your-instance-id/v3/tone?version=2017-09-21')

# 准备要分析的文本请求体
request_body = { text: "今天的工作效率超高,心情太棒了!" }.to_json

# 初始化POST请求
request = Net::HTTP::Post.new(tone_uri)
request.body = request_body
request['Content-Type'] = 'application/json'

# 处理HTTP基本认证
watson_username = '你的服务凭证用户名'
watson_password = '你的服务凭证密码'
auth_string = "#{watson_username}:#{watson_password}"
encoded_auth = Base64.strict_encode64(auth_string)
request['Authorization'] = "Basic #{encoded_auth}"

# 发送请求并获取响应
response = Net::HTTP.start(tone_uri.hostname, tone_uri.port, use_ssl: true) do |http|
  http.request(request)
end

# 输出结果
puts "响应状态码: #{response.code}"
puts "分析结果: #{response.body}"

几个关键注意点

  • 认证头是核心:必须把username:password做Base64编码后,放在Authorization请求头里,格式严格是Basic <编码后的字符串>,这是Watson服务识别凭据的唯一标准方式。
  • 端点URL别写错:不同地区的服务端点不一样(比如us-south、eu-gb),要和你在IBM Cloud控制台里复制的完全一致。
  • 请求格式要合规:Tone Analyzer要求请求体是JSON格式,所以必须设置Content-Type: application/json,同时确保请求体是合法的JSON字符串。

如果你的凭据是IAM API Key(现在IBM Cloud更常用这个),那认证方式会变:需要先获取Bearer Token,再用Authorization: Bearer <token>的方式,但你说curl能用,大概率还是传统的用户名密码凭证,上面的代码应该能直接解决你的问题。

内容的提问来源于stack exchange,提问作者Acris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:08:12