Saltar al contenido

HTTP POST con Json en el cuerpo – Flutter/Dart

Si te encuentras con algún detalle que no comprendes puedes comentarlo y te ayudaremos lo mas rápido que podamos.

¡Esto funciona!

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;

Future postRequest () async 
  var url ='https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';

  Map data = 
    'apikey': '12345678901234567890'
  
  //encode Map to JSON
  var body = json.encode(data);

  var response = await http.post(url,
      headers: "Content-Type": "application/json",
      body: body
  );
  print("$response.statusCode");
  print("$response.body");
  return response;

OK, finalmente tenemos una respuesta…

Estás especificando correctamente headers: "Content-Type": "application/json", para establecer su tipo de contenido. Debajo del capó, ya sea el paquete http o el nivel inferior dart:io HttpClient está cambiando esto a application/json; charset=utf-8. Sin embargo, la aplicación web de su servidor obviamente no espera el sufijo.

Para probar esto lo probé en Java, con las dos versiones

conn.setRequestProperty("content-type", "application/json; charset=utf-8"); // fails
conn.setRequestProperty("content-type", "application/json"); // works

¿Puede ponerse en contacto con el propietario de la aplicación web para explicar su error? No puedo ver dónde Dart está agregando el sufijo, pero lo miraré más tarde.

EDITAR
La investigación posterior muestra que es el http paquete que, mientras hace mucho del trabajo duro por usted, está agregando el sufijo que no le gusta a su servidor. Si no puede hacer que arreglen el servidor, puede pasar por alto http y usa el dart:io HttpClient directamente. Terminas con un poco de repetitivo que normalmente es manejado por ti por http.

Ejemplo de trabajo a continuación:

import 'dart:convert';
import 'dart:io';
import 'dart:async';

main() async 
  String url =
      'https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
  Map map = 
    'data': 'apikey': '12345678901234567890',
  ;

  print(await apiRequest(url, map));


Future apiRequest(String url, Map jsonMap) async 
  HttpClient httpClient = new HttpClient();
  HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
  request.headers.set('content-type', 'application/json');
  request.add(utf8.encode(json.encode(jsonMap)));
  HttpClientResponse response = await request.close();
  // todo - you should check the response.statusCode
  String reply = await response.transform(utf8.decoder).join();
  httpClient.close();
  return reply;

Dependiendo de su caso de uso, puede ser más eficiente reutilizar HttpClient, en lugar de seguir creando uno nuevo para cada solicitud. Todo: agregue un poco de manejo de errores 😉

Esto también funcionaría:

import 'package:http/http.dart' as http;

  sendRequest() async 

    Map data = 
       'apikey': '12345678901234567890'
    ;

    var url = 'https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
    http.post(url, body: data)
        .then((response) 
      print("Response status: $response.statusCode");
      print("Response body: $response.body");
    );  
  

Comentarios y puntuaciones del tutorial

Nos puedes añadir valor a nuestro contenido asistiendo con tu veteranía en las aclaraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *