Handling CORS Issues in Ionic
If you have no way to change the server configuration, you should use Http native plugin to perform Http requests from your mobile device, to prevent cors problems. However, in web enviroment you still need to use Angular's HtttClient. Fortunately, with ionic-native-http-connection-backend library you can use the same HttpClient service for both enviroments, and Http native will be used internally if the app is executed from a mobile device. It's a kind of wrapper.
When developing locally using ionic serve
or ionic run/emulate -l -c
with livereload enabled, ionic creates a local dev server at port 8100 by default (http://localhost:8100/
). The origin
in this case is localhost:8100
, which when you contact an external service via HTTP with CORS enabled, they deem the request not trustworthy and therefor reject it.
As suggested by Ionic themselves (http://blog.ionic.io/handling-cors-issues-in-ionic/) , you can create a proxy alias within the Ionic app to route the API calls via, avoiding the origin
issue altogether, however, their guide was specific for Ionic 1, so here is an update for Ionic v2.
Creating a Proxy in Ionic v2
Open ionic.config.json
and add in the following proxies
setup.
{
"name": "project-name",
"app_id": "xyz-projectid",
"v2": true,
"typescript": true,
"proxies": [{
"path": "/api",
"proxyUrl": "https://the-real-api-host.com"
}]
}
In this instance, we are creating a path within the ionic app at /api
,which will forward requests to the endpoint https://the-real-api-host.com
.
If you wanted to use a different api endpoint, for example http://my-custom-api.com/api/v2/
, you could insert it into proxyUrl
instead.
Updating References to API Endpoint
In your app code, you now need to update all the references of the base URL for the API endpoint at https://the-real-api-host.com
with /api
. A call to /api
should be detected when in Ionic serve, and proxied to the real address.
Each projects implementation may vary. In my case, I did not have control of the API, as it was an external service, so I could not control the CORS handling/responses myself.
Note: remember to restart the server (ionic serve
) or you will get 404's from your API call because it will not yet be proxying.