0

FacebookのグラフAPIを使用してユーザーのウォールにメッセージを投稿しようとしています。 https://graph.facebook.com/me/feed

å、ä、öなどの文字は、����...などの記号で正しく表示されませんでした。

リクエストで送信されたすべての関連パラメーター(メッセージ、名前、説明)の周りにapacheCommonsStringEscapeUtils.encodeHtmlを使用しました。

def params = [
                accessToken: getFacebookAccessToken(),
                message: StringEscapeUtils.escapeHtml(deal.title),
                pictureUrl: imageUrl,
                name: StringEscapeUtils.escapeHtml(deal.title),
                description: StringEscapeUtils.escapeHtml(deal.shortDescription),
                actionLabel: StringEscapeUtils.escapeHtml(actionLabel),
                actionUrl: actionUrl
        ]


def graph(path, params, method = GET, contentType = JSON) {
        def http = null

        http = new TrustAllHttpBuilder(ConfigurationHolder.config.facebook.graph.uri)

        http.request( method, contentType) { req ->

            uri.path = path

        req.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES );
        req.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout );
        req.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, socketTimeout );

            requestContentType = URLENC

        body = params

            response.success = { resp, obj ->
                return obj

            }
        }
    }

この変更後、Facebookでは「名前」と「説明」が正しく表示されますが、「メッセージ」は正しく表示されません。

「メッセージ」が正しく表示されない理由はありますか?FBはそれを別の方法で処理しますか?

ここに画像の説明を入力してください

ありがとう


アップデート

JSONリクエストの本文を送信する前に、パラメータをUTF-8にURLEncodedするように調整しました。

def params = [
                accessToken: getFacebookAccessToken(),
                message: URLEncoder.encode(deal.title,"UTF-8"),
                pictureUrl: imageUrl,
                name: URLEncoder.encode(deal.title,"UTF-8"),
                description: URLEncoder.encode(deal.shortDescription,"UTF-8"),
                actionLabel: URLEncoder.encode(actionLabel,"UTF-8"), 
                actionUrl: actionUrl
        ]

リクエスト:

14:49:13 DEBUG [FacebookService] body: Message: Tommy+%C3%80%C3%84%C4%87%C3%95,Name: Tommy+%C3%80%C3%84%C4%87%C3%95,Description: %C3%80%C3%84%C4%87%C3%95%C3%80%C3%84%C4%87%C3%95,Caption: ,Action Label: TEST,ActionUrl: http://www.mytest.com


14:49:51 DEBUG [FacebookService] Calling facebook graph API https://graph.facebook.com/me/feed
14:49:51 DEBUG [TrustAllHttpBuilder] POST https://graph.facebook.com/me/feed
14:49:52 DEBUG [headers] >> POST /me/feed HTTP/1.1
14:49:52 DEBUG [headers] >> Accept: application/json, application/javascript, text/javascript
14:49:52 DEBUG [headers] >> Content-Length: 475
14:49:52 DEBUG [headers] >> Content-Type: application/x-www-form-urlencoded; charset=windows-1252
14:49:52 DEBUG [headers] >> Host: graph.facebook.com
14:49:52 DEBUG [headers] >> Connection: Keep-Alive
14:49:53 DEBUG [headers] << HTTP/1.1 200 OK
14:49:53 DEBUG [headers] << Access-Control-Allow-Origin: *
14:49:53 DEBUG [headers] << Cache-Control: private, no-cache, no-store, must-revalidate
14:49:53 DEBUG [headers] << Content-Type: application/json
14:49:53 DEBUG [headers] << Expires: Sat, 01 Jan 2000 00:00:00 GMT
14:49:53 DEBUG [headers] << Pragma: no-cache
14:49:53 DEBUG [headers] << X-FB-Rev: 
14:49:53 DEBUG [headers] << X-FB-Debug:
14:49:53 DEBUG [headers] << Date: Fri, 05 Oct 2012 13:49:52 GMT
14:49:53 DEBUG [headers] << Connection: keep-alive
14:49:53 DEBUG [headers] << Content-Length: 40

FBの結果(機能していません):

ここに画像の説明を入力してください

4

2 に答える 2

4

escapeHtmlこれは間違った方法です。メッセージにHTMLエンティティがどのように表示されているかがわかります。HTMLコードを投稿するのではなく、プレーンテキストを投稿する必要があります。

å、ä、öなどの文字は、����...などの記号で正しく表示されませんでした。

これは、アプリケーションが間違った文字エンコードを使用していることが原因である可能性があります。

必ずUTF-8を使用してください。(または、パラメーター値をAPIに渡す前にUTF-8に変換します。前者が不可能な場合は、変換します。)

編集:

以前にパラメータをUTF-8に変換してみました

14:49:13 DEBUG [FacebookService]本文:メッセージ:Tommy +%C3%80%C3%84%C4%87%C3%95、名前:…</ p>

これらはURLエンコードされたUTF-8文字です。ここでは、URLエンコードは逆効果です。

14:49:52 DEBUG[ヘッダー]>>コンテンツタイプ:application / x-www-form-urlencoded; charset = windows-1252

あなたはAPIの顔にそんなに露骨に嘘をついてはいけません:-)

真剣に、アプリがリクエストヘッダーでその文字セットを送信する理由を調べてください。また、UTF-8に変更する方法を確認してください(または文字セット部分を完全に除外します)。

于 2012-10-05T13:30:55.880 に答える
0

EncoderRegistryクラスには、リクエストデータに使用する文字セットフィールドがすでに含まれていることがわかりました。デフォルトはプラットフォームエンコーディングです。次のようにUTF-8に設定できます。

def graph(path, params, method = GET, contentType = JSON) {
        def http = null

        http = new TrustAllHttpBuilder(ConfigurationHolder.config.facebook.graph.uri)

        http.encoderRegistry = new EncoderRegistry( charset: 'utf-8' )  

        http.request( method, contentType) { req ->

            uri.path = path

        req.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES );
        req.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout );
        req.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, socketTimeout );

            requestContentType = URLENC

        body = params

            response.success = { resp, obj ->
                return obj

            }
        }
    }

回答参照

于 2012-10-08T12:31:51.893 に答える