我正在尝试使用DELPHI XE5 Update2中的REST客户端库组件将HTTP请求发送到Google Calendar / v3 API(TRESTClient
,TRESTRequest
,TRESToAuth2Autenticator
,{{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."
}
}
我有什么问题我做错了,怎么办才能让请求正常工作?谢谢你的帮助。
答案 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来比较工作和非工作请求,找出问题所在。