302のリダイレクトロケーションをレールで取得するにはどうすればよいですか? (httparty、net/http、redirectfollowerを試しました)
-
09-10-2019 - |
質問
こんにちは
Facebookユーザーのアルバムのカバー画像を入手しようとしています。
APIページで言われているように、「アルバムのカバー画像のURLが付いたHTTP 302」を取得すると、次のように戻ります。
http s://graph.facebook.com/ [album_id]}/picture?access_token = blahblahblah ...
ここの文書: http://developers.facebook.com/docs/reference/api/album
私はHTTPARTY、NET:HTTPとRedirectFollowerクラスを試しました
httpartyは画像自体を返し、「場所」(url)情報はどこにも返されません
ネット:HTTPとRedirectFollowerは少し難しいです...
URLをGETメソッドに渡すときにuri.encodeを使用しない場合、「bad uri」エラーを引き起こします
しかし、uri.encodeを使用してエンコードされたURIを渡すと、eoferrorを引き起こします(ファイルの終わりに到達しました)
驚くべきことは、ApigeeのFB APIを使用するときにロケーションURLを見ることができるということです
ネットで推奨されるリダイレクト方法は次のとおりです。HTTPドキュメント:
変更する必要がありますか?それとも、これを行う簡単な方法はありますか?ありがとうございました!!
def self.fetch(uri_str, limit = 10)
response = Net::HTTP.get_response(URI.parse(uri_str))
case response
when Net::HTTPSuccess then response
when Net::HTTPRedirection then fetch(response['location'], limit - 1)
else
response.error!
end
end
解決 2
試行錯誤の後に私が最終的に終わるものは次のとおりです。
uri_str = URI.encode(https://graph.facebook.com/[album_id]}/picture?access_token=blahblahblah...)
result = Curl::Easy.http_get(uri_str) do |curl|
curl.follow_location = false
end
puts result.header_str.split('Location: ')[1].split(' ')[0]
返されたheader_strのように見えます
「HTTP BLAH BLAH BLAH LOCATION: http://xxxxxx/xxxx.jpg 何とか何とか何とか"
だから私は2分割()を使用してURLを取得することができました
最終結果はクリーンなURLです
また、curl.follow_locationは偽である必要があるため、そのページの本文が返されません
他のヒント
宝石の使用を気にしないなら、 curb
あなたのためにこれをします。それはすべてを使用することです follow_location
パラメーター:
gem 'curb'
require 'curb'
# http://www.stackoverflow.com/ redirects to http://stackoverflow.com/
result = Curl::Easy.http_get("http://www.stackoverflow.com/") do |curl|
curl.follow_location = true
end
puts result.body_str
ただし、この機能を備えたライブラリはこれだけではありません。
メモとして、多くの場合、ヘッダーに無効な場所を取得し、ユーザーエージェントがそれを有用なものにするために解釈する必要があります。のようなヘッダー Location: /
フェッチする前に書き直す必要があります。他の時には、次のようなヘッダーを取得します Location: uri=...
そして、そこから場所を引き出す必要があります。自分自身を書き直すよりも、あなたの図書館に任せるのが本当に最善です。