Estoy creando una aplicación flutter con django rest-framework. La API de registro funciona bien en Postman, pero después de un registro exitoso desde la aplicación flutter, muestra el error anterior. La solicitud se ha enviado a la dirección https.
csrf eliminado. No pasa nada.
var data = {'email':signupemailidcontroller.text, 'password1':passwordcontroller.text, 'password2':confirmpasswordcontroller.text, }; //http request here await http.post(websitesignupurl, headers: headers, body: json.encode(data)) .then((onResponse){ print(onResponse.body); }).catchError((onerror){ print(onerror.toString()); });
SocketException: Error de SO: Conexión rechazada, errno = 111
Espero que la respuesta de esta solicitud sea un objeto Json que contenga el usuario y el token.
Harnish, necesito algunos detalles más para depurar este error.
Solución posible:
Si está ejecutando el servidor localmente y usando el emulador de Android, entonces el punto final de su servidor debe ser 10.0.2.2:8000
: 8000 en lugar de localhost:8000
ya que AVD usa 10.0.2.2
como un alias para la interfaz de bucle invertido de su host (es decir, localhost
)
Nota sobre futuros
Noté arriba que el código está usando await y luego en la misma línea. Esto puede ser confuso, para ser claros, await
se usa para suspender la ejecución hasta que se complete un futuro, y then
es una función de devolución de llamada para ejecutar después de que se complete un futuro. Lo mismo podría escribirse de la siguiente manera
void myFunction() async { var data = {}; var response = await http.post(URL, headers:headers, body:data); if (response.statusCode == 200) { print(reponse.body); } else { print('A network error occurred'); } }
o el método no asíncrono/en espera
void myFunction() { var data = {}; http.post(URL, headers:headers, body:data) .then((response) => print(response.body)) .catchError((error) => print(error)); }
Para obtener información más detallada sobre futuros en Dart, lea https://www.dartlang.org/tutorials/language/futures
ipconfig
y obtenga el ipv41: Ejemplo:
await http.post("http://127.68.34.23/wp-json/...", headers: headers, body: json.encode(data))
si en el servidor escribe la url de main en url
Intente agregar <uses-permission android:name="android.permission.INTERNET"/>
a su manifiesto. Esto resolvió este problema para mí.
Además de la respuesta de Rohan, también puedes leer:
Estaba tratando de ejecutar mi aplicación en un dispositivo físico usando un servidor local, así que tuve que usar el comando mencionado a continuación, aquí tenga en cuenta cambiar el número de puerto de acuerdo con su propio número de puerto
adb reverse tcp:3001 tcp:3001
Como @maheshmnj señaló que este comando está redirigiendo el puerto 3001 de su teléfono al puerto 3001 de su computadora. En caso de que desee redirigir el puerto 2000 de su teléfono al puerto 3000 de su computadora, entonces podría hacer esto
adb reverse tcp:2000 tcp:3000
también puede leer sobre adb y redes a través de la página mencionada a continuación https://developer.android.com/studio/command-line/adb.html
Arreglé esto con $ adb tcpip <port-your-local-server>
Esto es lo que tuve que cambiar para corregir el mismo error en mi caso:
python manage.py runserver 0:8000
y no solo python manage.py runserver
(0:8000 es la abreviatura de 0.0.0.0:8000 y hace que su aplicación web sea visible en su red local; consulte https://docs. djangoproject.com/en/3.0/ref/django-admin/#runserver )ipconfig
en la terminal si está en Windows, de lo contrario, ifconfig
.ALLOWED_HOSTS = ['*', ]
(¡pero solo en su entorno de desarrollo!)Lo que debe hacer es obtener la IP pública de su PC y usarla en su URL, por ejemplo: http://192.168.0.67:3000 , donde 3000 es el número de puerto.
Fui a la terminal y usé el comando ifconfig
Tengo mi dirección IP: 192.168.0.109
Luego simplemente reemplacé esta dirección IP con mi "localhost" en las solicitudes http de la aplicación flutter. ¡Y funcionó como un encanto!
Tuve este mismo problema una vez. Después de revisar algunas respuestas de stackoverflow demasiado complicadas y buscar en Google, finalmente lo descubrí. En este caso, lo más probable es que estés usando un emulador de Android. Entonces, solo enciende los datos móviles en el emulador. Inténtalo de nuevo, estoy seguro de que esta vez funcionará.
Tuve el mismo problema al ejecutar en un dispositivo real, y solo cambiar la IP en el enlace API no funciona.
La solución para mí fue ejecutar el servidor con el siguiente comando:
manage.py runserver 0.0.0.0:8000
Luego pase la IP de su máquina al enlace API en lugar de localhost, como se muestra a continuación:
http://192.168.0.67:8000
Tuve el mismo problema en flutter con spring backend. En lugar de usar 'http://localhost:8080/' en mis solicitudes, cambié esto a 'http://143.235.7.641:8080/' donde '143.235.7.641' es mi dirección IPv4 de Wi-Fi, y funcionó .
(NOTA: supongo que está probando aleteo en un teléfono físico, y el teléfono y la computadora están conectados al mismo wi-fi).
En C#[.net core api], vaya a launchSettings.json en la pestaña Propiedades y cambie el siguiente código a este (cambie localhost a 0.0.0.0 en applicationURl) y en la aplicación (flutter), use su IP IPV4 local. ej.: (192.169.0.10)
"coreWebAPI": { "commandName": "Project", "launchBrowser": false, "launchUrl": "api/values", "applicationUrl": "http://0.0.0.0:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }
Para que los usuarios de Mac verifiquen la dirección IP
en el tipo de terminal: ipconfig getifaddr en0
y use esa dirección IP como se muestra a continuación
import 'dart:io'; import 'package:http/http.dart' as http; import 'package:fluttertoast/fluttertoast.dart'; class AuthAction { static String BASE_URL = 'http://192.168.0.105:27017/'; static Future<Null> signUpAction( firstName, lastName, email, password, userName) async { try { http.Response res = await http.post( Uri.parse(BASE_URL + 'signUp' )); print(res); if (res.statusCode == 200) { } } catch (err) { print(err); // Fluttertoast.showToast(msg: 'err'); } } }
Nota: no toqué el puerto en el que se ejecuta mi servidor mongo-node. que es 27017
Pruebe este enlace para retrasar la función y no obtendrá este error.
Future.delayed(const Duration(milliseconds: 500), () { widget.callback(); });
Si está ejecutando en un teléfono real, obtendrá este error incluso si agrega su dirección de host local al host permitido. Para mí, conectar mi computadora portátil al punto de acceso de mi teléfono y ejecutar el servidor django con la dirección ipv4 de la computadora portátil (que puede encontrar usando el comando ipconfig) mediante python manage.py ejecuta el servidor 192.168. . : 8000, es decir, su dirección ipv4: número de puerto, luego podrá acceder al servidor django usando el navegador de su teléfono también, ahora agregue esta su dirección ipv4 a su host permitido. Y cambie su URL de localhost o 127.0.0.1 a su dirección ipv4. Espero que esto resuelva tu problema.
Uri.parse("YourURL").replace(host: "YourIPAddress");
Explicación: este error significa que su dirección de host no es correcta (como ya se señaló en las respuestas anteriores). Como probablemente tenga un dispositivo físico, debe acceder al servidor emulador que conectó a su computadora (también conocido como su dirección IP).
¿Cómo obtener mi dirección IP?
MAC: ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'
WINDOWS: netsh interface ip show address | findstr "IP Address"
Sé que la pregunta es demasiado antigua, pero responderé esto porque puede ser útil para alguien que tiene este problema.
Sin más detalles, no puedo dar una solución específica. Pero con las siguientes condiciones puede dar una solución específica.
La URL que probó con el cartero puede ser algo como esto http://127.0.0.1:[port number]/register
o http://localhost:[port number]/register
. Pero es posible que esto no funcione con un emulador porque no tiene acceso a esa URL. Para obtener acceso a su host local, debe averiguar la dirección del host.
Siga estos pasos para obtener su dirección de host.
Luego puede ver su host name
con el port number
. Luego reemplace su URL con aquellas como http://10.0.0.2:5000/register
.
Si está utilizando 'localhost' en su URL, cámbielo a su dirección ipv4 y funcionará
final response = await client.post( "http://192.xxx.xx.xx/api/signin", headers: {"Authorization": apiKey}, body: jsonEncode({ "username": username, "password": password, }));
Incluso tuve un error de excepción de socket, pero reemplacé mi dirección IP y no mencioné ningún número de puerto y funcionó para mí, y si menciono el número de puerto arrojaría un error. Esperando que esto funcione.
Estoy usando Flask para backend, usando bloques.
Este problema ocurre cuando el punto final es incorrecto o su host y el backend del servidor (API de Laravel de ejemplo) no comparten la misma dirección IP.
La solución es.
ifconfig
.IP ADDRESS
de su computadora, sudo php artisan serve --host YOUR_COMPUTER_IP_ADDRESS --port NUMBER
Ejemplo:
`sudo php artisan serve --host 192.168.1.11 --port 80`
http://192.168.1.11:80/Your_Route
Solución que funcionó en mi máquina
[√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.19043.1288], locale en-US) [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0) [√] Chrome - develop for the web [√] Android Studio (version 2020.3) [√] VS Code (version 1.61.2) [√] Connected device (3 available)
en tipo terminal/cmd
ifconfig
para Mac/Linux/Unixipconfig
para Windows obtendrá algún resultado en Windows parece
❌ No hagas
http.get('localhost/my-local-rest-api/etc'
127.0.0.1//my-local-rest-api/etc
.✅ Hacer
http.get('10.0.2.2/my-local-rest-api/etc
http.get('192.168.8.155/my-local-rest-api/etc
⚠ siempre pase Uri en lugar de un ejemplo de cadena sin formato: http.get(Uri.parse('my-url-in-raw-string'))
en android/app/src/debug/AndroidManifest.xml
<manifest ...other params...> // STEP: 1 make sure you have INTERNET permission <uses-permission android:name="android.permission.INTERNET" /> <application android:label="YourAppName" android:usesCleartextTraffic="true"> <-- STEP: 2 add this line <activity </application> </manifest>
en ios/Runner/Info.plist
agrega esto
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsLocalNetworking</key> <true/> </dict>