Does ASP NET Core web API support authentication?

Forbind Android App til Lokal API: Undgå 'Connection Refused'

16/01/2023

Rating: 3.94 (3344 votes)

Som Android-udvikler kender du sikkert glæden ved at se din app komme til live. Men før den kan interagere med den virkelige verden, skal den ofte tale med en backend-server. Under udviklingen kører denne backend typisk lokalt på din egen maskine. Det lyder ligetil, ikke? Desværre er det at forbinde din Android-app fra en emulator eller en fysisk enhed til en lokal API sjældent så simpelt, som det umiddelbart virker. En af de mest frustrerende fejl, du sandsynligvis vil støde på, er 'Connection Refused', og det kræver nogle specifikke trin at løse den. Denne udfordring kan bremse din udviklingsproces betydeligt, især når du konstant skal teste nye funktioner, der er afhængige af backend-data.

Should you use a Remote API for your mobile app?
Your mobile app will definitely benefit if you can store data remotely on a server or eliminate some difficult tasks to a remote device. Connecting to a remote API will keep all of your data secure when it’s stored. As a result, the app can still run smoothly on the user’s end.

Denne guide vil trin for trin gennemgå, hvordan du korrekt forbinder din Android-app til en lokal API. Vi dykker ned i de almindelige årsager til 'Connection Refused'-fejlen og giver dig de nødvendige konfigurationer for at få det hele til at spille sammen. Målet er at give dig en problemfri udviklingsoplevelse, så du kan fokusere på at bygge fantastiske apps i stedet for at kæmpe med netværkskonfigurationer.

Indholdsfortegnelse

Hvorfor 'Connection Refused' opstår, når du bruger en lokal API 🚦❌

Forestil dig, at din Android-emulator er en lille, selvstændig computer. Når du forsøger at kalde http://localhost:PORT fra denne emulator, vil anmodningen fejle. Hvorfor? Fordi localhost i emulatorens kontekst refererer til emulatoren selv, ikke til din udviklingscomputer. Din API kører på din fysiske maskine, og emulatoren har ingen indbygget viden om, hvordan den skal finde din maskines 'localhost'. Det er som at bede en person i et andet rum om at finde sin egen ven ved navn 'lokal vært' – de leder kun i deres eget rum.

For at din app kan finde din API, skal du derfor pege din app mod din computers lokale netværks-IP-adresse (IPv4-adresse) i stedet for localhost. Dette sikrer, at anmodningen sendes ud af emulatoren og videre til det lokale netværk, hvor din computer er synlig.

Udover problemet med localhost er der en anden faktor: sikkerhed. Mange lokale API'er kører med HTTP (ukrypteret trafik) under udvikling, da det er enklere at sætte op. Android blokerer dog som standard HTTP-forbindelser af sikkerhedsmæssige årsager, da det foretrækker den krypterede HTTPS-protokol. Dette betyder, at selvom du har den korrekte IP-adresse, vil din app stadig afvise forbindelsen, medmindre du eksplicit tillader HTTP-trafik. Disse to punkter – forkert adresse og blokeret trafik – er de primære årsager til den berygtede 'Connection Refused'-fejl. Lad os nu se, hvordan vi trin for trin løser disse problemer.

Trin 1: Find din computers IPv4-adresse

Før vi foretager ændringer i din Android-app, skal du finde din computers IPv4-adresse. Denne adresse er det unikke identifikationsnummer for din maskine inden for dit lokale netværk (f.eks. dit hjemmenetværk eller kontornetværk). Det er denne adresse, din emulator eller enhed vil bruge til at 'se' din API.

For Windows:

Åbn 'Kommandoprompt' (Command Prompt) ved at søge efter 'cmd' i Start-menuen og kør derefter kommandoen:

ipconfig

Se efter 'IPv4-adresse' under din aktive netværksforbindelse (f.eks. 'Ethernet-adapter' eller 'Trådløs LAN-adapter Wi-Fi'). Et eksempel kunne være: 192.168.1.100.

For macOS:

Åbn 'Terminal' og kør kommandoen:

ifconfig | grep "inet "

Find inet-værdien under din aktive forbindelse (oftest en0 for Ethernet eller en1 for Wi-Fi). Et eksempel kunne være: 192.168.1.100.

Bemærk denne adresse, da du får brug for den i de næste trin. Det er vigtigt at sikre, at din Android-enhed eller emulator og din udviklingsmaskine er forbundet til det samme lokale netværk for, at denne forbindelse kan fungere.

Trin 2: Tillad HTTP-trafik i Android

Som nævnt tidligere blokerer Android som standard HTTP-forbindelser af sikkerhedsgrunde. Dette skyldes, at HTTP-trafik er ukrypteret og sårbar over for aflytning. Men under udvikling er det ofte nødvendigt at bruge HTTP for at teste lokale API'er. For at tillade dette skal du eksplicit give din app tilladelse til at håndtere 'cleartext traffic' (ukrypteret trafik) for specifikke domæner.

Opret en sikkerhedskonfigurationsfil

Inde i dit Android-projekt skal du oprette en ny fil. Først skal du muligvis oprette xml-mappen, hvis den ikke allerede findes i res-mappen:

📂 res/xml/network_security_config.xml

Tilføj følgende indhold til filen. Husk at erstatte your-ipv4 med din faktiske IPv4-adresse, som du fandt i Trin 1:

<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">din-ipv4-adresse</domain> </domain-config> </network-security-config>

I denne konfiguration sætter vi cleartextTrafficPermitted="true" for et specifikt domæne (din IPv4-adresse). Dette fortæller Android, at det er acceptabelt at sende ukrypteret HTTP-trafik til denne specifikke adresse. Brugen af includeSubdomains="true" sikrer, at eventuelle underdomæner (selvom det er mindre relevant for en direkte IP-adresse) også er dækket. Det er yderst vigtigt at huske, at denne konfiguration kun bør anvendes til udviklingsformål. I en produktions-app skal du altid bruge HTTPS for at beskytte dine brugeres data.

Hvorfor kan vi ikke bare bruge localhost eller 127.0.0.1 her?

Igen, når en emulator kører din app, refererer localhost (og dermed også 127.0.0.1) til selve emulatoren, ikke din computer. Derfor virker det ikke at bruge disse værdier i din netværkssikkerhedskonfiguration. Du skal bruge din computers faktiske IPv4-adresse for at pege korrekt på din lokale API.

Trin 3: Opdater din Base URL i appen

Nu hvor vi har den korrekte IPv4-adresse, skal vi opdatere den base-URL, som din app bruger til at kalde API'en. Dette er sandsynligvis en konstant eller en variabel i din kode, der definerer API'ens startpunkt. I stedet for at bruge localhost, skal du nu bruge din IPv4-adresse.

Før (med fejl):

const val BASE_URL = "http://localhost:3333"

Efter (korrekt):

const val BASE_URL = "http://192.168.1.100:3333"

Erstat 192.168.1.100 med din egen IPv4-adresse og 3333 med den port, din lokale API kører på. Dette trin er afgørende, da det er her, din app får den korrekte 'vejviser' til din API.

Forbedring med BuildConfig

For at gøre det lettere at skifte mellem forskellige miljøer (f.eks. lokalt, staging, produktion) og for at undgå at hardcode URL'er direkte i din kode, er det god praksis at definere base-URL'en i din Gradle build-fil. Dette giver dig større fleksibilitet og gør din kode mere robust.

Gå til: app/build.gradle.kts (eller app/build.gradle hvis du bruger Groovy)

Tilføj følgende under android { buildTypes { ... } }:

android { buildTypes { debug { isDebuggable = true buildConfigField("String", "API_BASE_URL", "\"http://192.168.1.100:3333\"") } release { // For produktionsmiljøet skal du bruge HTTPS og din live API-adresse buildConfigField("String", "API_BASE_URL", "\"https://api.production.com\"") } } }

Nu kan du i din kode få adgang til base-URL'en dynamisk, og den vil automatisk skifte afhængigt af, om du bygger en debug- eller release-version af din app:

val baseUrl = BuildConfig.API_BASE_URL

Dette er en meget mere skalerbar tilgang til at håndtere API-URL'er og er en god praksis for enhver seriøs Android-udvikling. Den tillader dig at have forskellige konfigurationer til forskellige miljøer uden at skulle ændre koden manuelt hver gang.

Trin 4: Knyt sikkerhedskonfigurationen i AndroidManifest.xml

Det sidste trin er at fortælle Android, at det skal bruge den network_security_config.xml-fil, du oprettede i Trin 2. Dette gøres ved at tilføje en reference i din apps AndroidManifest.xml-fil.

Åbn din AndroidManifest.xml-fil (typisk placeret i app/src/main/) og tilføj android:networkSecurityConfig-attributten inde i <application>-tagget:

<application android:allowBackup="true" android:name=".app.MyApplication" android:networkSecurityConfig="@xml/network_security_config"> ... </application>

Denne linje fortæller Android-systemet, at det skal anvende de sikkerhedsregler, der er defineret i din network_security_config.xml-fil. Uden dette trin vil Android ignorere din sikkerhedskonfiguration, og HTTP-forbindelser vil fortsat blive blokeret. Sørg for, at attributten er placeret korrekt inden for <application>-tagget. Gem alle dine ændringer, og synkroniser dit Gradle-projekt, hvis du har foretaget ændringer i build.gradle.kts.

Sammenligningstabel: Fra Forvirring til Forbindelse

For at opsummere de vigtigste ændringer og forskelle, se denne tabel:

AspektForkert metode (før løsning)Korrekt metode (efter løsning)
API-adressehttp://localhost:PORT eller http://127.0.0.1:PORThttp://DIN_IPV4_ADRESSE:PORT
NetværkstrafikBlokeret (HTTP) af AndroidTilladt (HTTP) via network_security_config.xml
Emulator/Enheds perspektivlocalhost peger på emulator/enhed selvDIN_IPV4_ADRESSE peger på din udviklingscomputer
ResultatConnection Refused eller netværksfejlSuccesfuld forbindelse til lokal API
Anbefalet praksisHardcoded URL i kodenBrug af BuildConfig til miljøhåndtering

🎉 Nu kan du teste din app med en lokal API!

På dette tidspunkt skulle din Android-app være i stand til at forbinde til din lokale API, der kører på din maskine. Lad os hurtigt opsummere, hvad vi har gjort for at nå hertil:

  • Vi fandt IPv4-adressen på din computer.
  • Vi oprettede en netværkssikkerhedskonfiguration for at tillade HTTP-forbindelser til din lokale IP.
  • Vi opdaterede Base URL'en i din app til at bruge IPv4-adressen i stedet for localhost (og lærte om den bedre metode med BuildConfig).
  • Vi linkede sikkerhedskonfigurationen i din AndroidManifest.xml-fil.

Nu, når du foretager API-kald fra din app, skulle det fungere ligesom det ville med en fjern backend! Dette åbner op for en meget mere effektiv og behagelig udviklingsproces, hvor du hurtigt kan iterere og teste dine backend-ændringer uden at skulle deploye dem til en fjern server.

Ofte Stillede Spørgsmål (FAQ)

Hvorfor kan jeg ikke bare bruge 127.0.0.1 i stedet for localhost?

127.0.0.1 er den numeriske repræsentation af localhost. Problemet er det samme: inde i Android-emulatoren eller på en fysisk enhed refererer 127.0.0.1 til selve emulatoren/enheden, ikke din udviklingsmaskine. Derfor skal du bruge din computers eksterne IPv4-adresse på det lokale netværk for at oprette forbindelse.

Er det sikkert at tillade HTTP-trafik med cleartextTrafficPermitted="true"?

Nej, det er det ikke for en produktions-app. Denne indstilling er udelukkende beregnet til udviklingsformål, hvor du tester mod en lokal API. I en live app er det afgørende at bruge HTTPS for at kryptere al kommunikation og beskytte brugerdata mod aflytning og manipulation. Sørg for at fjerne eller ændre denne konfiguration, før du udgiver din app til produktionsmiljøet.

Hvad hvis min IPv4-adresse ændrer sig ofte?

Din IPv4-adresse kan ændre sig, især hvis du bruger DHCP (Dynamic Host Configuration Protocol) og din router tildeler dig en ny adresse med jævne mellemrum, eller hvis du skifter netværk. Hvis dette sker, skal du gentage Trin 1 for at finde din nye adresse og opdatere den i din network_security_config.xml og din Base URL (helst via BuildConfig). For at undgå dette kan du overveje at konfigurere en statisk IP-adresse til din udviklingsmaskine i dit lokale netværk, hvis din router understøtter det.

Kan jeg teste med en fysisk Android-enhed i stedet for en emulator?

Ja, absolut! De samme principper gælder. Den vigtigste betingelse er, at både din fysiske Android-enhed og din udviklingscomputer skal være forbundet til det samme lokale netværk (f.eks. via den samme Wi-Fi-router). Når de er på samme netværk, kan din enhed finde din computers IPv4-adresse, og de samme konfigurationer beskrevet i denne guide vil fungere.

Hvad hvis jeg stadig får 'Connection Refused' efter at have fulgt alle disse trin?

Hvis du stadig oplever problemer, er her nogle almindelige fejlfindingstips:

  • Firewall: Kontroller, om din computers firewall blokerer indgående forbindelser til den port, din API kører på. Du skal muligvis tilføje en undtagelse.
  • API kører ikke: Dobbelttjek, at din lokale API faktisk kører og lytter på den korrekte port.
  • Forkert port: Sørg for, at den port, du specificerer i din Base URL (f.eks. :3333), matcher den port, din API lytter på.
  • Netværksforbindelse: Bekræft, at din emulator/enhed og din computer er på det samme lokale netværk.
  • Typografi: Tjek omhyggeligt for slåfejl i IPv4-adressen, portnummeret eller i dine XML-konfigurationsfiler.
  • Genstart: Prøv at genstarte din emulator/enhed og genbygge din app.

Ved systematisk at gennemgå disse punkter vil du sandsynligvis finde årsagen til problemet.

Afsluttende Tanker

At kunne teste din Android-app mod en lokal API er en fundamental del af en effektiv udviklingsproces. Selvom 'Connection Refused'-fejlen kan virke skræmmende i starten, er løsningen relativt ligetil, når du forstår de underliggende netværksprincipper og Androids sikkerhedsmekanismer. Ved at følge denne guide har du nu værktøjerne til at konfigurere din app korrekt, så den problemfrit kan kommunikere med din lokale backend.

Husk altid at adskille udviklings- og produktionskonfigurationer, især når det kommer til sikkerhedsindstillinger som tilladelse af HTTP-trafik. God praksis som at bruge BuildConfig for API-URL'er vil tjene dig godt på længere sigt.

Vi håber, at denne guide har løst dit problem og banet vejen for en mere produktiv og mindre frustrerende Android-udviklingsrejse. God kode!

Hvis du vil læse andre artikler, der ligner Forbind Android App til Lokal API: Undgå 'Connection Refused', kan du besøge kategorien Teknologi.

Go up