私は Node.js を使用しています:
var s = 'Who\'s that girl?';
var url = 'http://graph.facebook.com/?text=' + encodeURIComponent(s);
request(url, POST, ...)
これは動作しません!そして、Facebookは私のテキストを切り取ります...
完全なコード:
function postToFacebook(fbid, access_token, data, next){
var uri = 'https://graph.facebook.com/'+String(fbid)+'/feed?access_token='+access_token;
var uri += '&' + querystring.stringify(data);
request({
'method':'POST',
'uri': uri,
},function(err,response,body){
next();
});
};
app.get('/test',function(req,res){
var d = {
'name':'Who\'s that girl?',
'link': 'http://example.com',
'caption': 'some caption...',
'description': 'some description...',
'picture': 'http://i.imgur.com/CmlrM.png',
};
postToFacebook(req.user.fb.id, req.user.fb.accessToken, d);
res.send('done');
});
Facebookは壁に空白の投稿を取得します。テキストは表示されません。なし。
URIを記録すると、次のようになります。
https://graph.facebook.com/1290502368/feed?access_token=2067022539347370|d7ae6f314515c918732eab36.1-1230602668|GtOJ-pi3ZBatd41tPvrHb0OIYyk&name=Who's%20that%20girl%3F&link=http%3A%2F%2Fexample.com&caption=some%20caption...&description=some%20description...&picture=http%3A%2F%2Fi.imgur.com%2FCmlrM.png
明らかに、そのURLを見ると、アポストロフィが正しくエンコードされていないことがわかります。
私は同様のことを(Node.jsでも)やっていて、最初にJavaScriptの組み込みの escape() 関数を使用しようとしましたが、実際には機能しませんでした。
検索が機能するようになった方法は次のとおりです。それは単なるまぐれかもしれません:
function doMySearch(showTitle) {
showTitle = escapeShowTitle(showTitle)
var url = "http://graph.facebook.com/search?q=" + showTitle + "&type=page"
doSomethingWith(url)
}
function escapeShowTitle(title) {
title = title.replace(/'/g, "")
title = escape(title)
return title
}
doMySearch("America's Funniest home Videos")
同じ問題があった場合、encodeURIComponentは一重引用符をエンコードしませんでした。トリックは、 'を%27に置き換えることですafterエンコーディング:
var trackArtistTitle = encodeURIComponent("Johnny Vegas - Who's Ready Fo'r Ice Cre'am")
// result: Johnny%20Vegas%20-%20Who's%20Ready%20Fo'r%20Ice%20Cre'am
trackArtistTitle = trackArtistTitle.replace(/'/g, '%27')
// result: Johnny%20Vegas%20-%20Who%27s%20Ready%20Fo%27r%20Ice%20Cre%27am
このように、trackArtistTitleはサーバーで適切にデコードされます。つまり、PHPを使用してurldecode()を使用します。
このリンクで指定されているように一重引用符をエンコードできます http://www.w3schools.com/TAGS/ref_urlencode.asp
私はこれがOPの質問に対処していないことを知っていますが、OData Query関連の質問でここに来る人のために、エスケープ文字は、さらに別の単一引用符です。
_unescapedValue.replace(/'/g, '\'\'')
_
これは、すでに文字列に対してencodeURIComponent(unescapedValue)
を実行していることを前提としています