Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

API do instalura está dando Access Denied

Ao acessar a url http://localhost:8080/api/public/fotos/rafael, copiar os dados, colar no JSONLint e ao tentar acessar a link da propriedade urlPerfil a página está me retornando Access Denied, mesmo já tendo gerado os dados previamente. Por causa disso estou tendo o Warning " Network request failed" no .catch da fetch, e só aparece uma tela branca

 componentDidMount() {

    fetch('http://localhost:8080/api/public/fotos/rafael')
      .then(resposta => resposta.json())
      .then(json => this.setState({fotos: json}))
      .catch(error => console.warn('ERROR = ' + error))
  }
export default class Post extends Component {

  render() {
    return (
      <View>
        <View style = {styles.cabecalho}>
          <Image source = {{uri: this.props.foto.urlPerfil}} style = {styles.foto_de_perfil}/>
          <Text>{this.props.foto.loginUsuario}</Text>
        </View>

        <Image source = {{uri: this.props.foto.urlFoto}} style = {styles.foto}/>
      </View>
    );
  }
}
6 respostas

Fala Pedro, tudo bem ?

Não entendi o que você tentou fazer => "ao tentar acessar a link da propriedade urlPerfil a página está me retornando Access Denied"

Como você tentou acessar esse link? A API tem endereços padrão mapeados, por exemplo o endereço publico http://localhost:8080/api/public/fotos/rafael sempre vai retornar a lista de fotos presente desse usuário. Qualquer outra alteração desse endereço pode resultar numa tentativa de acesso a um endereço não mapeado pela API, o que pode dar problema no filtro de segurança, que exige que toda requisição não mapeada deve ser executado por usuários logados. (o que pode dar access denied).

A ideia é que depois de receber o conteúdo dessa lista vc deve extrair para um json e usar um setState para atualizar o estado do seu componente com os novos dados. Daí em diante você pode usar as informações.

Dê uma olhada em como foi feito o acesso e tente novamente. Atualizei o código da API do instalura disponível através do link https://instalura-api.herokuapp.com/api/. Você também pode baixar o novo jar disponível no repositório https://github.com/alberto-alura/instalura-api.

Espero ter ajudado. Abraço!

Fala Rafael, beleza? valeu pela resposta, acho que não ficou claro, mas é o seguinte, eu executo o comando pro.jar rodar, ele fica rodando no terminal, eu acesso o http://localhost:8080/api/public/fotos/rafael pelo navegador, abre normalmente o JSON gigante, só que quando eu coloco no fetch que dá problema

componentDidMount() {
    fetch('http://localhost:8080/api/public/fotos/rafael')
      .then(resposta => resposta.json())
      .then(json => this.setState({fotos: json}))
      .catch(error => console.warn('Error = ' + error))
  }

ele só me retorna o erro que tô pegando com o .catch, que é "TypeError: Network request failed", usando pelo herokuapp não dá isso, só pelo .jar mesmo. O que eu acho que possa ser, e que ficou confuso é que ele não está conseguindo acessar algum link gerado pela API, então eu colei o JSON gigante do http://localhost:8080/api/public/fotos/rafael no JSONLint pra ver os objetos literais, eu acessei o link do "urlFoto" e abriu essa foto

https://instagram.fcgh10-1.fna.fbcdn.net/t51.2885-15/e35/14482111_1635089460122802_8984023070045896704_n.jpg?ig_cache_key=MTM1MzEzNjM4NzAxMjIwODUyMw%3D%3D.2

Mas quando eu tentei abrir o link do "urlPerfil" que deu o Acess Denied

https://instagram.fcgh10-1.fna.fbcdn.net/t51.2885-19/s150x150/12599387_1591433254512484_973178862_a.jpg que pra mim, seria o motivo de estar retornando esse Network request Failed

E aí Pedro ?

Você está testando o app em qual plataforma ? Pelo Simulator IOS ou pelo emulador Android ?

Emulador Android, tô no Ubuntu, e quando instalei o mysql configurei a senha, ai tenho que usar

java -Dspring.datasource.password=senha -jar instalura.jar

E sim, a senha tá certa, o terminal fica executando a API em tempo real.

solução!

Comecei o curso de React Native 2, e lá tem a solução pra esse problema, é só fazer o fetch para :

http://10.0.2.2:8080/api/public/fotos/rafael

Boa Pedro.

Essa era justamente a suspeita. O Android não reconhece como localhost a máquina sobre a qual está operando, mas sim o próprio emulador, o que causa esse problema. Usando esse endereço base (10.0.2.2) aí sim conseguimos nos referir a máquina que está rodando o emulador e a api.

Abraço e bons estudos!