要解决你的问题,你必须小心逃避一切
Shellwords.escape
然后不引用它们。
<
curl -s "#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions" \
-X POST \
-H "Content-Type: application/json" \
-d #{Shellwords.escape(myJson)} \
-H "Authorization: Bearer #{CANVAS_TOKEN}"
SHELL
但这是乏味和容易出错的,并不是你真正的问题。
整个过程就是在ruby中发布嵌套json的解决方案。平面json在大多数http gems中都可以工作,但是很少需要嵌套json,恐怕大多数gems都没有针对它进行测试……
嵌套的json并不少见,而且http客户端不应该关心json的内容。它只是在传送一根弦。
您的json格式不正确。具体如下:
"comments_html": "
Please post your questions to a discussion.
"你有一个没有替罪羊的引语。这可能是因为您手工将嵌套的json组合在一起。就像脱壳卷曲一样,这很容易出错。
相反,创建一个ruby散列并将其转换为json。然后你就可以得到ruby语法检查的所有好处。
payload = {
question: {
question_type: "multiple_choice_question",
question_text: "
Is everything clear?
",points_possible: 1,
answers: [
{
text: "I read and understood",
html: "",
weight: 100
}, {
text: "I have questions",
comments_html: %Q[
Please post your questions to a discussion.
],weight: 0
}
]
}
}
require "json"
json_payload = JSON.generate(payload)
而不是打电话
curl
,使用http库。因为您调用的是rest api,所以可以使用
RestClient
.
require "rest-client"
response = RestClient.post(
"#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions",
json_payload,
{ content_type: :json, authorization: "Bearer #{CANVAS_TOKEN}" }
)
或者,更好的是,使用
canvas-api gem
它负责json转换,并可以利用api特性,比如分页。
canvas = Canvas::API.new(:host => CANVAS_URI, :token => CANVAS_TOKEN)
response = canvas.post(
"/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions",
payload
)