Ruby如何将变量传入API请求体 解决实例变量nil导致API空返回问题
问题原因分析
- 核心问题1:你完全没必要将
ZendeskAPI::Ticket对象转字符串再拆分提取description,该对象本身就自带description属性,可以直接获取对应值,原来的字符串拆分逻辑不仅冗余,还很容易返回空值或错误内容 - 核心问题2:DeepL接口返回的是标准JSON格式,你用字符串拆分
"取结果的逻辑非常脆弱,一旦返回结构变动就会取到错误值 - 潜在问题:你代码里的
auth_key参数为空,需要填入你自己的有效DeepL API密钥才能正常请求
修复后的代码
module Ccenter module Utils class TranslationApi attr_accessor :cc_message_id include Service InvalidResponseError = Class.new(StandardError) # 建议把API密钥放到环境变量里,不要硬编码在代码中 DEEPL_AUTH_KEY = ENV.fetch('DEEPL_API_KEY', '') def initialize(cc_message_id) @cc_message_id = cc_message_id end def call grab_de_message_text # 加一层校验,避免描述为空时发起无效请求 raise InvalidResponseError, "工单描述为空" if @ticket_description.blank? make_request end private def make_request response = Faraday.post( 'https://api.deepl.com/v2/translate', { text: @ticket_description, target_lang: 'DE', source_lang: 'EN' }, { 'Authorization' => "DeepL-Auth-Key #{DEEPL_AUTH_KEY}" } ) if response.success? # 直接解析JSON取结果,更稳定 result = JSON.parse(response.body) return result.dig('translations', 0, 'text') else raise InvalidResponseError, "DeepL请求失败,状态码:#{response.status}" end end def grab_de_message_text ticket = Ccenter::Adapters::Zendesk::TicketBase.new(zendesk_id: @cc_message_id).zendesk_ticket # 直接调用对象属性取值,不要转字符串拆分 @ticket_description = ticket&.description end end end end
额外注意点
- 把DeepL API密钥放到环境变量里读取,不要硬编码在代码中,避免密钥泄露
- 增加了空值校验逻辑,在工单描述为空时直接抛出错误,不用发起无效的API请求
- 如果你用的是DeepL免费版接口,需要把请求地址换成
https://api-free.deepl.com/v2/translate
内容的提问来源于stack exchange,提问作者user16741832
相关产品推荐
相关产品推荐

