Прочитать URL-адрес абсолютного перенаправленного атрибута SRC для изображения - PullRequest
0 голосов
/ 24 марта 2011

Я использую API аватара Twitter для получения URL-адреса аватара пользователя на стороне клиента, и я хотел бы кэшировать ответ, но вместо обычного JSON (или даже любого другого типа) они просто выполните редирект 302.

Это не работает (потому что это междоменный домен):

jQuery.getJSON('https://api.twitter.com/1/users/profile_image/60173.json',
function(data, status, jqxhr){
  console.log("data: ", data);
  console.log("status: ", status);
  console.log("jqxhr: ", jqxhr);
  console.log(jqxhr.getResponseHeader('Location'));
  console.log(jqxhr.getAllResponseHeaders());
})

Данные пусты, статус «успех», jqhxr возвращает объект jqxhr, но getResponseHeader () и getResponseHeaders () имеют значение null, поскольку это междоменный вызов, а не настоящий вызов XMLHTTP.

Поэтому я подумал, что смогу использовать событие load (), чтобы показать фактический URL-адрес изображения после того, как произошло 302. Я попробовал это:

function avatar_loaded(img) {
  console.log("We loaded an avatar for %s (img)[0].src is %o
attr('src') is %o getAttribute('src') is %o", img, jQuery(img)[0].src, jQuery(img).attr('src'), img.getAttribute("src"));
}

var avatar_url = "https://api.twitter.com/1/users/profile_image/60173";

jQuery('body').append("<img onload='avatar_loaded(this)' src='" +
avatar_url + "' width='0' height='0'>");

Вы увидите, что функция avatar_loaded вызывается дважды. Один раз с начальным значением img src (https://api.twitter.com/1/users/profile_image/60173), а затем снова, предположительно, с 302-м действительным URL-адресом изображения http://a1.twimg.com/profile_images/1272489576/Photo_38_normal.jpg

Но я не могу прочитать перенаправленный абсолютный URL независимо от того, что я пытаюсь. Есть другие идеи?

РЕДАКТИРОВАТЬ: Я не хотел, чтобы это превратилось в время, поэтому я просто использовал

http://api.twitter.com/1/users/show.json?user_id=

вызов API. Я предполагал, что для защищенных пользователей это потребует аутентифицированного вызова, а не так, что его можно использовать.

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Вместо того чтобы использовать API-вызов

http://api.twitter.com/1/users/profile_image/<user_id>

, я использовал

http://api.twitter.com/1/users/show.json?user_id=

и извлек оттуда URL-адрес аватара.Он не такой легкий, потому что он также возвращает множество других пользовательских данных, но аватары даже защищенных пользователей возвращаются без аутентификации, поэтому это подходящая замена.

0 голосов
/ 24 марта 2011

Вот код, который загружает его только один раз: http://jsfiddle.net/ionutzp/6Ekub/1/

avatar_loaded = function(img) {
  console.log("We loaded an avatar for %s (img)[0].src is %o attr('src') is %o getAttribute('src') is %o", img, jQuery(img)[0].src, jQuery(img).attr('src'), img.getAttribute('src'));
}

var avatar_url = "https://api.twitter.com/1/users/profile_image/60173";

$(window).load(function(){
        var img = new Image();
        $(img).load(function(){avatar_loaded(this)}).attr('src',avatar_url).appendTo('body');
       //jQuery('body').append("<img onload='' src='" + avatar_url + "' width='100' height='100'>");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...