Ruby中如何将变量替换到转义Shell字符串并处理JSON链接?
解决Ruby与Shell转义冲突:在curl的JSON payload中插入Ruby变量
这个问题的核心在于Ruby字符串插值、JSON格式要求、Shell命令解析三者的转义规则冲突——你手动拼接JSON时,HTML链接里的双引号没有正确转义,导致Shell解析curl的-d参数时破坏了JSON结构。下面给你两种可靠的解决方案:
方案1:用Ruby的JSON库自动生成Payload(推荐)
手动拼接JSON很容易出错,尤其是嵌套HTML的时候。Ruby的json标准库可以帮你自动处理所有转义,完全避免手动转义的麻烦:
require 'json' # 先构建Ruby哈希结构,直接插入变量 question_hash = { question: { question_type: "multiple_choice_question", question_text: "<p>Is everything clear?</p>", points_possible: 1, answers: [ { text: "I read and understood", html: "", weight: 100 }, { text: "I have questions", comments_html: "<p>Please post your questions to a <a href=\"#{CANVAS_URI}/courses/#{COURSE_ID}/discussion_topics\">discussion</a>.</p>", weight: 0 } ] } } # 把哈希转成合法的JSON字符串,自动处理所有转义 json_payload = JSON.generate(question_hash) # 执行curl命令,用Shell单引号包裹JSON,防止Shell解析里面的双引号 `curl -s "#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions" \ -X POST \ -H "Content-Type: application/json" \ -d '#{json_payload}' \ -H "Authorization: Bearer #{CANVAS_TOKEN}"`
为什么这个方法有效?
JSON.generate会自动把HTML链接里的双引号转义成\",生成完全符合JSON规范的字符串。- 用Shell的单引号
'包裹-d的参数,Shell会把单引号内的内容当作字面量,不会解析里面的双引号和特殊字符,完美避免转义冲突。
方案2:手动转义嵌套双引号(不推荐,仅作参考)
如果你坚持手动拼接JSON字符串,需要在Ruby里把HTML链接的双引号转义两次:一次是Ruby字符串的转义,一次是JSON的转义。具体来说,就是把href="..."改成href=\\"..."\\",这样Ruby插值后会生成href=\"...\",符合JSON格式:
myJson = %Q|{ "question": { "question_type": "multiple_choice_question", "question_text": "<p>Is everything clear?</p>", "points_possible": 1, "answers": [ { "text": "I read and understood", "html": "", "weight": 100 }, { "text": "I have questions", "comments_html": "<p>Please post your questions to a <a href=\\"#{CANVAS_URI}/courses/#{COURSE_ID}/discussion_topics\\">discussion</a>.</p>", "weight": 0 } ] } }| # 执行curl时同样用单引号包裹payload `curl -s "#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions" \ -X POST \ -H "Content-Type: application/json" \ -d '#{myJson}' \ -H "Authorization: Bearer #{CANVAS_TOKEN}"`
为什么之前的修改失败?
你之前的代码里,HTML链接的href="#{...}"没有转义,导致生成的JSON中comments_html字段出现未转义的双引号,破坏了JSON结构。Shell解析-d "#{myJson}"时,会把这些双引号当作Shell字符串的边界,导致curl收到的payload不完整。
内容的提问来源于stack exchange,提问作者Adobe
相关产品推荐
相关产品推荐

