Gerade wenn man als Full-Stack Entwickler sowohl ein Backend als auch das passende Frontend entwickeln möchte, möchte man früher oder später die Aufrufe gegen eine lokale Version des Backends machen, um dieses besser debuggen zu können.
Wenn als Frontend dann vielleicht Xamarin.Forms oder Xamarin.Android zum Einsatz kommt, dann testen man seine App am einfachsten mit dem Android Emulator. Wenn man hier nun eine localhost-Adresse verwendet, dann schlägt dieser Request jedoch fehl.
Es gibt nämlich zwei Dinge an dieser Stelle zu beachten. Zunächst muss man sein Backend über eine 127.0.0.1-Adresse verfügbar machen, also bei einer .NET Core Web API zum Beispiel über die folgende Konfiguration:
public static IWebHost BuildWebHost(string[] args)
{
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://127.0.0.1:7201")
.Build();
}
Im Frontend muss dann speziell für Android die IP-Adresse von 127.0.0.1 auf 10.0.2.2 geändert werden. Also lautet die Url zur API unter Android nun wie folgt:
var apiUrl = "http://10.0.2.2:7201/api";
Zu beachten ist an dieser Stelle jedoch, dass dies nur im Android-Emulator funktioniert, denn der iOS-Simulator ist in der Lage Requests gegen localhost durchzuführen.
Daher ist es ratsam, dass die URL abhängig vom gerade verwendeten Gerät ermittelt wird. Sofern man nur eine Android-App entwickelt, ist dies natürlich kein Thema. Sollte man mit Xamarin.Forms eine App sowohl für Android als auch iOS entwickeln, so empfiehlt sich über Device.RuntimePlatform
zu prüfen, auf welchem System die App gerade läuft
Es ergibt sich dann das folgende Code-Snippet:
string apiUrl = null;
if (Device.RuntimePlatform == Device.iOS)
apiUrl = "http://localhost:7201/api";
else if (Device.RuntimePlatform == Device.Android)
apiUrl = "http://10.0.2.2:7201/api";
Man sieht also, dass es gar kein großer Aufwand ist von einem Android Emulator Requests gegen eine lokale API, welche unter localhost zur Verfügung steht, zu machen.