发送POST HTTP请求到google calendar / v3 API返回解析错误

时间:2014-06-19 11:45:42

标签: json delphi http httprequest google-calendar-api

我正在尝试使用DELPHI XE5 Update2中的REST客户端库组件将HTTP请求发送到Google Calendar / v3 API(TRESTClientTRESTRequestTRESToAuth2Autenticator,{{1 }})。在Delphi IDE中设置此组件后,GET请求运行良好,返回所需的JSON响应。

但是POST请求(https://www.googleapis.com/calendar/v3/calendars/primary/events),TRESTResponse中的参数设置为TRESTRequest.params且选项pkREQUESTBODY且值为:

poDoNotEncode

返回Google API错误:

{
   "end":{
      "date":"2014-06-13"
   },
   "start":{
      "date":"2014-06-13"
   },
   "summary":"reTest"
}

此代码和参数在DELPHI XE6中运行良好,而不是在XE5中。

{
   "error":{
      "errors":[
         {
            "domain":"global",
            "reason":"parseError",
            "message":"This API does not support parsing form-encoded input."
         }
      ],
      "code":400,
      "message":"This API does not support parsing form-encoded input."
   }
}

我有什么问题我做错了,怎么办才能让请求正常工作?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您没有正确设置RESTRequest。最有可能的是,您没有将请求正文ContentType设置为ctAPPLICATION_JSON。默认情况下,单个参数RESTRequest将使用ctAPPLICATION_X_WWW_FORM_URLENCODED,除非您另行指定。这在文档中说明:

REST.Client.TRESTRequestParameter.ContentType

  

当此参数保留为空时,将基本上根据进入请求正文的现有参数的数量来选择内容类型。    单参数请求使用application / x-www-form-urlencoded ,而多参数请求则使用multipart / mixed。

这可以解释为什么服务器抱怨数据是表单编码的。它正在查看正文的Content-Type标题,看到不受支持的值,并向您报告错误,忽略您发送的实际正文数据。

答案 1 :(得分:0)

基于

的API说明

https://developers.google.com/google-apps/calendar/v3/reference/events/insert

看起来JSON部分属于POST请求体。

错误消息听起来像JSON部分被编码为HTML表单字段值(您可以使用像Fiddler2这样的HTTP代理进行验证)。

提示:如果你有一个基于不同语言的工作客户端,你可以使用Fiddler2来比较工作和非工作请求,找出问题所在。