【问题标题】:google-api-ruby-client: Request serialization results in empty requestsgoogle-api-ruby-client:请求序列化导致空请求
【发布时间】:2019-09-19 21:36:30
【问题描述】:
replacement_requests = [
  Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: "{{name}}", replace_text: "Joe"),
  Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: "{{age}}", replace_text: "34"),
  Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: "{{address}}", replace_text: "Westwood"),
]

batch_request = Google::Apis::DocsV1::BatchUpdateDocumentRequest.new(requests: replacement_requests)

鉴于上述代码,当我将此 BatcUpdateDocumentRequest 实例传递给我的 service.batch_update_document 函数时,我收到 400 错误请求。这似乎与批量请求被序列化的方式有关。

为了说明,如果我们调用batch_request.to_json,我们会收到以下信息:

"{\"requests\":[{},{},{}]}"

这告诉我在序列化过程中出了点问题,但是我的代码似乎相当规范。

对为什么我的请求无法序列化有什么想法吗?

【问题讨论】:

    标签: ruby google-api-ruby-client


    【解决方案1】:
    • 您想通过 google-api-client 和 ruby​​ 使用 replaceAllText 请求。
    • 您已经能够使用 Google Docs API 为 Google Document 放置和获取值。

    如果我的理解是正确的,那么这个修改呢?在您的脚本中,创建的请求正文是{"requests":[{},{},{}]}。由此,错误发生。请修改脚本如下。

    修改点:

    • Google::Apis::DocsV1::SubstringMatchCriteria 用于contains_textGoogle::Apis::DocsV1::ReplaceAllTextRequest
    • Google::Apis::DocsV1::Request 用于Google::Apis::DocsV1::ReplaceAllTextRequest

    通过以上修改,请求体就创建好了。

    修改脚本:

    text1 = Google::Apis::DocsV1::SubstringMatchCriteria.new(text: "{{name}}")
    text2 = Google::Apis::DocsV1::SubstringMatchCriteria.new(text: "{{age}}")
    text3 = Google::Apis::DocsV1::SubstringMatchCriteria.new(text: "{{address}}")
    
    req1 = Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: text1 , replace_text: "Joe")
    req2 = Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: text2, replace_text: "34")
    req3 = Google::Apis::DocsV1::ReplaceAllTextRequest.new(contains_text: text3, replace_text: "Westwood")
    
    replacement_requests = [
        Google::Apis::DocsV1::Request.new(replace_all_text: req1),
        Google::Apis::DocsV1::Request.new(replace_all_text: req2),
        Google::Apis::DocsV1::Request.new(replace_all_text: req3)
    ]
    
    batch_request = Google::Apis::DocsV1::BatchUpdateDocumentRequest.new(requests: replacement_requests)
    
    # result = service.batch_update_document(document_id, batch_request)  # When you request with "batch_request", you can use this.
    

    请求正文:

    运行上述脚本时,会创建以下请求正文。

    {"requests":[
      {"replaceAllText":{"containsText":{"text":"{{name}}"},"replaceText":"Joe"}},
      {"replaceAllText":{"containsText":{"text":"{{age}}"},"replaceText":"34"}},
      {"replaceAllText":{"containsText":{"text":"{{address}}"},"replaceText":"Westwood"}}
    ]}
    

    注意:

    • 当出现授权相关错误时,请确认范围以及是否启用了Docs API。

    参考资料:

    如果这不起作用,我深表歉意。

    【讨论】:

    • 做到了。非常感谢。
    • @Joe Letizia 感谢您的回复。很高兴您的问题得到解决。
    • 感谢 v0.9 的回答。这是对的!来自google-api-ruby-client v0.8,我可以说它更容易,只需要创建散列requests 并对其进行json化。所有这些你需要知道的类,它被过度设计了,就好像这是 Java 领域一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多