es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo realizar una solicitud HTTP POST con encabezado y cuerpo de tipo de codificación de URL en Flutter/Dart

He estado tratando de hacer una petición POST a un punto final que requiere que tanto el encabezado como el cuerpo de la solicitud estén codificados, sin embargo, hasta ahora las respuestas que he recibido son errores 400. La única forma en la que he logrado que la petición funcione es con una petición curl y Thunder client en VSCode. A continuación se muestra el cuerpo de mi solicitud. Cualquier tipo de ayuda sería apreciada, gracias.

Con el paquete http de flutter:

Response response = await post(
  Uri.parse(URL), 
    headers: {
      'Authorization': 'Basic ${base64Encode(utf8.encode('$ID:$SECRET'))}',
      'Content-Type': 'application/x-www-form-urlencoded',
    }, 
    encoding: Encoding.getByName('utf-8'),
    body: {
      'grant_type': 'refresh_token',
      'refresh_token': refreshToken,
      'redirect_uri': redirectUri,
    }
);

Error:

Con el paquete Dio de flutter:

Dio.Dio dio = Dio.Dio();
  Dio.Response response = await dio.post(
      URL,
      data: {
        'grant_type': 'refresh_token',
        'refresh_token': refreshToken,
        'redirect_uri':
            redirectUri,
      },
      options:
          Dio.Options(contentType: Dio.Headers.formUrlEncodedContentType, headers: <string, string="">{'Authorization': 'Basic ${base64Encode(utf8.encode('$ID:$SECRET'))}'}));

Error:</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo un error 400 al intentar hacer una solicitud POST a un punto final que requiere que tanto el encabezado como el cuerpo de la solicitud estén codificados. Los mensajes de error indican que la solicitud está malformada.

    En tu primer fragmento de código, estás usando el paquete http de Flutter. Los encabezados y el cuerpo están codificados correctamente. Puede ser que el servidor no esté aceptando el formato de la solicitud. Podrías intentar codificar el cuerpo como una cadena de consulta en lugar de pares de clave-valor. Un ejemplo de esto podría ser:

    String bodyEncoded = 'grant_type=refresh_token&refresh_token=$refreshToken&redirect_uri=$redirectUri';
    
    Response response = await post(
          Uri.parse(URL),
          headers: {
            'Authorization': 'Basic ${base64Encode(utf8.encode('$ID:$SECRET'))}',
            'Content-Type': 'application/x-www-form-urlencoded',
          },
          body: bodyEncoded,
        );
    

    En tu segundo fragmento de código, estás usando el paquete Dio de Flutter. Las opciones parecen estar configuradas correctamente, pero el tipo de contenido no se está estableciendo para la solicitud. Podrías intentar quitar el tipo de contenido de los encabezados y agregarlo a las opciones en su lugar. Un ejemplo de esto podría ser:

    Dio.Dio dio = Dio.Dio();
        Dio.Response response = await dio.post(
          URL,
          data: {
            'grant_type': 'refresh_token',
            'refresh_token': refreshToken,
            'redirect_uri': redirectUri,
          },
          options: Dio.Options(
            headers: {'Authorization': 'Basic ${base64Encode(utf8.encode('$ID:$SECRET'))}'},
            contentType: Dio.Headers.formUrlEncodedContentType,
          ),
        );
    

    Prueba estos cambios y ve si funcionan. Si no, podría haber un problema con la configuración del servidor.

Comments are closed.