3

我正在使用 ColdFusion 10 的新 REST API,但遇到了 UTF-8 字符问题。似乎 ColdFusion 10 的新 REST API 完全破坏了非 ASCII 字符。有没有解决的办法?

例如,假设我有一个这样的端点:

<cfcomponent rest="true" restpath="/widgets" produces="application/json">

    <cffunction name="echo" access="remote" httpmethod="PUT" returntype="string">       
        <cfreturn GetHttpRequestData().content />
    </cffunction>

</cfcomponent>

这个端点只是简单地响应请求中发送的内容。

这是我的要求:

PUT http://www.mycompany.com/rest/v1.0/widgets HTTP/1.1
User-Agent: Fiddler
Host: www.mycompany.com
Content-Length: 15

こんにちは

这是我得到的回复:

HTTP/1.1 200 OK
Content-Type: application/json
Server: Microsoft-IIS/7.5
Date: Mon, 26 Aug 2013 23:59:09 GMT
Content-Length: 37

�ん���

请注意响应与请求是如何完全不同的。

为了 100% 确定这是 ColdFusion 破坏请求的问题,而不是 ColdFusion 生成的响应的问题,我增强了端点以将请求主体也记录到数据库中,果然,它已经被破坏。

有什么办法吗?

4

4 回答 4

3

我使用以下代码测试了您的 CFC:

<cfprocessingdirective pageencoding="utf-8">
<cfhttp method="put" url="http://localhost:8500/rest/restservices/widgets" result="httpResponse" charset="UTF-8">
    <cfhttpparam type="body" value="こんにちは">
</cfhttp>
<cfdump var="#httpResponse#">

并得到与您相同的输出。修改它以包含 Content-Type 标头修复它:

<cfprocessingdirective pageencoding="utf-8">
<cfhttp method="put" url="http://localhost:8500/rest/restservices/widgets" result="httpResponse" charset="UTF-8">
    <cfhttpparam type="header" name="Content-Type" value="text/plain; charset=UTF-8">
    <cfhttpparam type="body" value="こんにちは">
</cfhttp>
<cfdump var="#httpResponse#">

所以我想这证实了 AdamT(和彼得)的建议:你需要指定Content-Type.

于 2013-08-27T13:08:05.050 回答
2

我不能保证添加Content-Type标题并指定字符集会UTF-8解决您的问题;但我可以告诉你的是,Taffy 采用UTF-8 并且没有这个问题

缩略图:点击查看完整尺寸 http://note.io/1dLswMN

这是获取请求正文的 Taffy 代码的摘录:

<cffunction name="getRequestBody" access="private" output="false" hint="Gets request body data, which CF doesn't do automatically for some verbs">
    <cfset var body = getHTTPRequestData().content />
    <cfif isBinary(body)>
        <cfset body = charsetEncode(body, "UTF-8") />
    </cfif>
    <cfreturn body />
</cffunction>
于 2013-08-27T13:04:36.993 回答
1

还有另一种方法可以做到这一点,将它与 ColdFusion 生成自定义休息响应的能力相结合。此示例显示如何强制响应为 UTF-8。

<cffunction name="echo" access="remote" httpmethod="PUT" returntype="void">       
    <cfset response = structNew() >
    <cfset response.status = "200">
    <cfset response.statusText = "OK">
    <cfset response.headers["charset"] = "UTF-8">
    <cfset response.content = GetHttpRequestData().content>
    <cfset restsetResponse(response)>
</cffunction>

到目前为止,这是我为非 ASCII 字符集找到的唯一令人满意的解决方法。在您需要 UTF-8 之前,使用隐式 REST 的东西效果很好。我发现即使设置请求字符集也会被命中或错过,尤其是当您从数据库中取出 UTF-8 内容时。此覆盖部分记录在这里: http ://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518-5719eac51353e6bb244-7fec.html

于 2013-08-30T20:37:43.130 回答
0

对于那些仍然无法在响应中返回 UTF-8 字符的人来说,看起来将端点更改为返回字符串而不是结构可以解决问题。

示例(返回结构):

<cffunction name="foo" access="remote" httpmethod="GET" produces="application/json" restpath="foo" returntype="struct">

    <cfreturn {
        hello = "こんにちは"
    } />

</cffunction>

回复:

HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 06 Dec 2013 17:58:25 GMT
Content-Length: 17

{"HELLO":"?????"}

请注意,当返回结构时,ColdFusion 的内部序列化程序会破坏 UTF-8 字符。

另一方面,这是一个方法返回字符串的示例,我自己进行 JSON 序列化:

<cffunction name="foo" access="remote" httpmethod="GET" produces="application/json" restpath="foo" returntype="string">

    <cfreturn SerializeJSON({
        hello = "こんにちは"
    }) />

</cffunction>

回复:

HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 06 Dec 2013 17:59:12 GMT
Content-Length: 27

{"HELLO":"こんにちは"}

这很奇怪,但似乎有效。

于 2013-12-06T18:01:59.103 回答