3
respostas

Pegar a imagem de um Json

Bom dia! Sou nova em javascript e estou tentando colocar a imagem de um JSON do site da bing e colocar no meu body porém não estou conseguindo retorna o seguinte erro: Failed to load access-control-allow-origin: https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. (anonymous) @ test.html:30 test.html:35 erro de conexão É a primeira vez que consumo api podem me ajudar por favor ? Para pegar somente a imagem preciso criar uma chave de desenvolvedor ?

insira seu código aqui
function getData(url) { 
    return new Promise(function(resolve, reject){ 
      const req = new XMLHttpRequest() 

      req.open('GET', url) 
      req.onload = function () {

        if (req.status === 200) { 
          resolve(req.response)
        } else {
          reject(req.status, req.statusText) 
        }
      }
      req.onerror = function () { 
        reject("erro de conexão")

      }

       req.send() 
     })
  }

  const catchImage = document.getElementById("body") 

  getData 

  const url = getData("Access-Control-Allow-Origin: https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR").then(function(response)
  {
    const jsonResponse =JSON.parse(response.images.url)
    console.log(response)
    catchImage.innerHTML = ""
    for (const url of jsonResponse["url"]) {
        catchImage.innerHTML = catchImage.innerHTML + "<img src='" + images.url +  "' />"
      console.log(url)
    }
  }, function(error) { console.log(error)})
3 respostas

Oi Renata,

O erro está dizendo que vc está tentando fazer um request usando um protocolo que não está nessa lista: http, data, chrome, chrome-extension, https

O que acontece é que sua sua função getData está recebendo uma url inválida como parâmetro.

Na hora de criar a constante url, tente tirar o ""Access-Control-Allow-Origin: ", ficaria assim:

  const url = getData("https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR").then(function(response)

Artur Obrigada pela resposta! Então quando tiro Access-Control-Allow-Origin Me retorna o seguinte erro Requisição cross-origin bloqueada: A política de mesma origem (Same Origin Policy) impede a leitura do recurso remoto em https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR. (Motivo: o cabeçalho CORS 'Access-Control-Allow-Origin' não está presente) nas minhas pesquisas li que isso acontece por que é uma política que restringe o uso de ajax para endereços diferentes do domínio da aplicação e que nesse endereço, não é permitido troca de protocolo ou porta que usar o Access-Control-Allow-Origin: antes do endereço http poderia resolver o problema motivo pelo qual usei some esse erro porém aparece o que mencionei anteriormente

Oi Renata,

entendi por que colocou o Access-Control-Allow-Origin:.

Só que se colocar ele antes da URL, ela fica inválida porque o protocolo (http) tem que vir primeiro segundo o padrão.

Esse Access-Control-Allow-Origin é na verdade um cabeçalho que deveria estar na resposta do servidor. Esse cabeçalho diz quais sites podem fazer AJAX pra esse endereço https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR.

O servidor do bing é quem deveria colocar esse cabeçalho na resposta. Se ele não colocar esse cabeçalho na resposta, ele deveria então habilitar pedidos de JSONP, que é uma técnica/gambiarra que eu testei e vi que eles não fazem.

Sem uma dessas duas coisas, o navegador não vai permitir que o conteúdo da resposta seja acessado. Como isso é uma coisa que o servidor do Bing teria que ter feito, não há um código só no front-end que possa fazer isso. Na verdade é possível desativar essa restrição de segurança em vários navegadores numa página de configuração chamada about:flags. Isso não é nem um pouco recomendado, já que as pessoas teriam que mudar uma configuração global de segurança do navegador só pra acessar um site.

Na época que descobri isso fiquei muito chateado :'(

O Bing fez isso pra que ninguém fizesse uma requisição AJAX mesmo. É de propósito. Sem um cabeçalho Access-Control-Allow-Origin na resposta, o navegador não deixa fazer AJAX. Esse cabeçalho vem de uma especificação chamada CORS. A MDN tem um bom material sobre CORS se quiser dar uma olhada.

Mas nem tudo está perdido! Se você conseguir fazer um request HTTP em qualquer lugar que não siga o CORS, você vai conseguir acessar as informações. O CORS são regras que o navegador segue quando quer fazer requests pra um servidor. Essas regras não existem fora dos navegadores.

Um lugar que podemos fazer requests HTTP fora dos navegadores é no próprio servidor. Ou seja, é possível você criar um servidor seu que faça os pedidos para você. Ao invés de acessar o servidor do Bing, você faria um request para esse seu servidor e ele faria o pedido pro Bing. Depois, com a resposta do Bing em mãos, o seu servidor te responderia usando o conteúdo que veio e colocando os cabeçalhos do CORS certinhos.

Em resumo, não tem um código front-end que possa acessar esse JSON, mas existe uma solução criando-se um servidor pra isso.

Se precisar de alguma dica ou ajuda pra seguir é só falar Renata.

Abraço,

Artur

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software