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

[Bug] NÃO FUNCIONA, função register

Estou a horas nesse problema, uma galera já perguntou a mesa coisa mas as resposta são incompletas, inconstante, não soluciona, parece que são respostas automática. Desculpa o desabafo.

Função Register

O serviço resister deveria registrar um conteúdo com a chave 'content' no Jason Server de recurso 'learnhttp'

class JournalService {
  static const String url = 'http://192.168.11.187:3000/';
  static const String resource = 'learnhttp/';

  String getUrl() {
    return '$url$resource';
  }

  resister(String content) {
     http.post(Uri.parse(getUrl()),
        body: json.encode({"content": content}),
        headers: {"Content-Type": "application/json"}
     );

  }
}

Servidor Json

É rodado um db.json:

{
  "learnhttp": {}
}
JSON Server started on PORT :3000
Press CTRL-C to stop
Watching db.json...

♡( ◡‿◡ )

Index:
http://localhost:3000/

Static files:
Serving ./public directory if it exists

Endpoints:
http://192.168.11.187:3000/learnhttp

Entretanto quando chamamos a função register não funciona

JournalService service = JournalService();
  service.resister('Olá mundo');

Já tentei de tudo, baixei o arquivo pós aula, também está com esse problema, falaram que era pra colocar o learnhttp como lisa, mas isso não faz o menor sentido. Nossa estou extremamente estressado e perdendo meu tempo, não tenho um nível alto de programação para advinhar o que deveria ser dito em aula. E por favor, só coloquem solucionada quando de fato acharem a solução e testem, pelo amor de Deus.

3 respostas
solução!

Olá boa tarde!

Esse é um problema bem específico do emulador de Android. Depois de algumas atualizações de build dentro do Flutter, nós tivemos que fazer algumas alterações na maneira que avisamos o emulador para fazer requisições internas.

Algumas notas importantes:

  • Eu estou utilizando o Flutter na versão 3.19.5
  • Importante utilizar o json-server na versão 0.17.4
  • Também para evitar erros, você pode apagar a dependência do google_fonts do arquivo pubspec.yaml

O json-server teve uma atualização que acabou quebrando várias ferramentas que utilizávamos antes. Inclusive até a maneira que ele lida com requisições. Você pode desinstalar a versão atualizada rodando o comando:

npm unsintall -g json-server

Para instalar o json-server na versão certa, utilize o seguinte comando:

npm install -g json-server@0.17.4

Para rodar o json-server, utilize o seguinte comando dentro da pasta server:

json-server -H 127.0.0.1 -p 3000 db.json

Dentro do arquivo journal_service será necessário alterar algumas coisas. Começando pela url:

http://10.0.2.2:3000/

Essa mudança é necessária por conta do emulador Android. Essa rota aponta para o ip 127.0.0.1 que foi o que definimos para o json-server.

Agora na função register precisamos adicionar um header:

  void register(String content) {
    client.post(
      Uri.parse(getURL()),
      headers: {"Content-Type": "application/json"},
      body: json.encode({"content": content}),
    );
  }

O header se tornou uma obrigação em alguma atualização do pacote http.

Meu arquivo journal_service.dart completo:

import 'dart:convert';

import 'package:flutter_webapi_first_course/services/http_interceptors.dart';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http/http.dart';

class JournalService {
  static const String url = "http://10.0.2.2:3000/";
  static const String resource = "learnhttp/";

  http.Client client = InterceptedClient.build(
    interceptors: [LoggingInterceptor()],
  );

  String getURL() {
    return "$url$resource";
  }

  //TODO: Substituir getURL por getURI
  void register(String content) {
    client.post(
      Uri.parse(getURL()),
      headers: {"Content-Type": "application/json"},
      body: json.encode({"content": content}),
    );
  }

  void get() async {
    http.Response response = await client.get(Uri.parse(getURL()));
  }
}

Espero ter te ajudado! Bons estudos.

Só uma nota extra: Meu arquivo db.json está igual ao seu.

Erro permanece

Olá amigo, já tenho feito todas as recomendações que você falou, infelizmente esse problema que eu relato continua. Pessoalmente eu desistir desse fórum da Alura, tenho que ir atrás de minhas dúvidas em outras comunidades, essa pergunta mesmo está com um ano que ninguém soluciona e a galera vem lançando a mesma questão. Já reintalei todos os programas, até o Node.js está na versão do professor, usei o comendo npm install -g json-server@0.17.4, mas mesmo assim não funciona a função register para resistrar um objeto.