Coldfusion调用Google Translate API接口失败求助
代码实现
CFC中的cfscript代码
httpService = new http(); httpService.setMethod(action); httpService.setCharset("utf-8"); httpService.setUrl("https://translation.googleapis.com/language/translate/v2"); httpService.addParam(type = "header", name = "X-Goog-Api-Key", value = "theActualAPIKey"); httpService.addParam(type = "header", name = "Content-Type", value = "application/json"); httpService.addParam(type = "body", value = "#body#"); res = httpService.send().getPrefix();
请求Body的JSON结构
{ "q": ["good-bye", "Hello", "What time is it"], "source": "en", "target": "es" }
错误详情
详细信息:表达式要求变量或中间表达式结果为简单值,但结果无法转换为简单值。简单值包括字符串、数字、布尔值和日期/时间值;查询、数组和COM对象等属于复杂值。
最可能的原因是您尝试将复杂值用作简单值,例如在cfif标签中使用查询变量。
错误编号 0
错误信息:复杂对象类型无法转换为简单值。
堆栈跟踪:coldfusion.runtime.CfJspPage$ComplexObjectException: Complex object types cannot be converted to simple values. at coldfusion.runtime.Cast._String(Cast.java:1409) at coldfusion.runtime.Cast._String(Cast.java:1347) at coldfusion.tagext.net.HttpTag.setBody(HttpTag.java:1667) at coldfusion.tagext.net.HttpParamTag.doStartTag(HttpParamTag.java:219) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:5274) at cfbase2ecfc970638991$funcINVOKETAG.runFunction(G:\JBoss7_3\www14dev1\deployments\cfusion.ear\cfusion.war\WEB-INF\cfusion\CustomTags\com\adobe\coldfusion\base.cfc:325) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:623) at coldfusion.filter.SilentFilter.invoke(SilentFilter.java:47) at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:553) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:516) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:95) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:463) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:438) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:310) at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:5084) at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:5064) at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:4352) at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:4290) at cfhttp2ecfc620228233$funcSEND.runFunction(G:\JBoss7_3\www14dev1\deployments\cfusion.ear\cfusion.war\WEB-INF\cfusion\CustomTags\com\adobe\coldfusion\http.cfc:103) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:623) at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:553) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:516) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:95) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:463) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:438) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:310) at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:975) at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:696) at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:503) at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:4327) at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:4290) at
## 问题分析与解决方案 从堆栈跟踪可以看出,错误实际发生在`HttpTag.setBody`方法中,而非代码中标记的`getPrefix()`行——ColdFusion的错误行号有时会和实际执行点有偏差。 ### 核心问题 代码中`httpService.addParam(type = "body", value = "#body#")`的`body`变量如果是**ColdFusion结构体/数组(复杂类型)**,而非序列化后的JSON字符串,就会触发“复杂对象无法转换为简单值”的错误。HTTP请求的Body需要传入字符串格式的JSON,而不是ColdFusion的原生复杂对象。 ### 修复步骤 1. **将ColdFusion对象序列化为JSON字符串** 如果`body`是用ColdFusion结构体定义的,先通过`serializeJSON()`转换为标准JSON字符串: ```cfscript // 定义请求结构体 requestBodyStruct = { q: ["good-bye", "Hello", "What time is it"], source: "en", target: "es" }; // 序列化为JSON字符串 requestBodyJSON = serializeJSON(requestBodyStruct);
正确设置Body参数
直接传入序列化后的字符串变量,不需要用#包裹(包裹会强制字符串转换,可能导致格式错误):httpService.addParam(type = "body", value = requestBodyJSON);正确获取响应内容
原代码中getPrefix()并非获取HTTP响应内容的标准方法,应该改用getContent()获取响应体,再根据需要反序列化为ColdFusion对象:httpResponse = httpService.send(); // 获取响应字符串 responseContent = httpResponse.getContent(); // 解析为ColdFusion结构体 responseData = deserializeJSON(responseContent);
经过以上调整,即可匹配curl/regbin的请求格式,避免复杂对象转换错误。
内容的提问来源于stack exchange,提问作者Smoketx

