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

Existe diferença entre get e post para pegar o retorno da requisição?

Olá, tudo bem?

Após assistir a aula tentei seguir os passos mas não para realizar uma requisição "get", como mostrado na aula, mas para um post. Entretanto, não estou conseguindo pegar o retorno JSON do back-end.

Vou apresentar o código para que vocês entendam o que estou fazendo.

app.component.ts

public cotacaoRetorno: CotacaoRetorno[];
private cotacaoService: CotacaoService;

constructor(cotacaoService: CotacaoService) { 
    this.cotacaoService = cotacaoService;
  }

onSubmit() {
    this.realizarCotacao();
  }

realizarCotacao()
  {
    this.cotacaoService.novaCotacao()
    .subscribe(cotacaoRetorno => this.cotacaoRetorno = cotacaoRetorno);

    console.log(this.cotacaoRetorno);
//Obs.: No console o retorno de "this.cotacaoRetorno" mostra: "undefined"
  }

cotacao.service.ts

@Injectable({ providedIn: 'root' })
export class CotacaoService {

    constructor(private httpClient: HttpClient) {
        this.http = httpClient;
    }

    protected get requestHeaders(): { headers: HttpHeaders | { [header: string]: string | string[]; } } {
        const headers = new HttpHeaders({

          'Content-Type': 'application/json'
        });

        return { headers };
      }

    private http: HttpClient;
    private readonly _realizarCotacaoUrl: string = '/cotacao/realizar-cotacao';


    novaCotacao() {
        const cotacaorl = ConfiguracaoService.baseUrl() + this._realizarCotacaoUrl;
        var novaCotacao = new Cotacao("nome", "teste", "", "", 10, 10, 10, 1, 1, "", new Date("2019-01-01"));

       return this.http      
        .post<CotacaoRetorno[]>(cotacaorl, JSON.stringify(novaCotacao), this.requestHeaders);
        }
}

Apenas ressaltando que o retorno mostrado no console é: "undefined".

Obs.: Todos os imports foram feitos corretamente.

Desde já, Obrigado!

4 respostas

Bom dia, Maycon! Como vai?

Isso ocorre pois a requisição feita ao servidor é assíncrona, por isso, ao chegar na linha console.log(this.cotacaoRetorno) pode ser que a requisição não tenha sido respondida. O que acaba resultando nesse comportamento que vc está tendo.

Sendo assim, o correto seria fazer como visto a seguir.

realizarCotacao() {
    this.cotacaoService.novaCotacao()
        .subscribe(cotacaoRetorno => {
               this.cotacaoRetorno = cotacaoRetorno;

               console.log(this.cotacaoRetorno);
        });
}

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Fala professor Gabriel, tudo bem e com o senhor?

Deixa eu te falar.. A sua solução deu certo! Porém, meio que está dando certo apenas ali dentro do .subscribe pois estou tentando jogar esse JSON para a sessionStorage e lá aparece como "undefined". O senhor tem alguma ideia do que pode estar acontecendo?

Segue código:

onSubmit() {
    this.realizarCotacao();
    this.save();
  }

save(){
    const data = JSON.stringify(this.cotacaoRetorno);
    sessionStorage.setItem('cotacao', data);
  }

E ah.. Já aproveitando a viagem.. dentro do .subscribe naquele console.log(), eu tentei o seguinte: console.log(this.cotacaoRetorno[0]) tentando mostrar apenas os dados na posição 0 e o que mostra é "undefined", onde estou errando?

Obrigado pela atenção e pela força e um forte abraço!

solução!

Opa, Maycon! Tudo ótimo!

Então, nesse caso o problema é o mesmo. O método realizaCotacao() é assíncrono, então o save() é invocado sem ter garantia nenhuma de a requisição já ter sido feita. Pra resolver vc precisará implementar basicamente a mesma solução que eu mostrei antes. Segue o código.

realizarCotacao() {
    this.cotacaoService.novaCotacao()
        .subscribe(cotacaoRetorno => {
               this.cotacaoRetorno = cotacaoRetorno;

               console.log(this.cotacaoRetorno);

               this.save();
        });
}

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Uma última dúvida professor..

No meu exemplo estou recebendo um JSON com 3 posições. Mas não consigo mostra-las indivudualmente usando "console.log(this.cotacaoRetorno[0])" e até mesmo "console.log(this.cotacaoRetorno.length)" retorna "undefined". Pode me quebrar mais esse galho?

Muito obrigado!