I built a web app in VS Code using Java, Angular, and Spring Boot. My code runs well locally, but when you deploy it to AWS or Heroku something interesting happens. The backend sends the output to /api/articles and a JSON shows up here yet the front end is not fetching it for some reason. Now, interesting enough after a minute or two the articles show up in the front end but only in my machine. I want to make this part clear: it works from aws and heroku servers but so far only when I access it from my pc, not even my phone or a friends laptop. I am completely clueless.
Usually when I am developing API endpoints for a new service, I will run into similar issues when I am not setting CORS correctly.
To make an AJAX call from the browser to a server the server must return an header to inform the browser the domain is allowed to call this server.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
Related
Currently I'm learning to build a REST API (backend) with the ionic application (frontend), but I'm facing an issue in backend REST API deployment. Thus, I'm asking this question to get some clues and answers related to REST API deployment, since I'm really new and no clue how to deploy a REST API. I had checkout some tutorial on youtube, but it seem like most of the example in videos are not using the technologies or environment that same as the REST API I built. The following shown the technologies I used to built my system frontend and backend:
REST API (BACKEND):
Language: Java, Spring MVC Framework
Database: Hibernate, Oracle SQL Developer
Web App Build Technology: Gradle, Gretty (To app start my application)
Ionic Application (FRONTEND):
Technologies: Angular Framework, HTML, CSS
How the application is working in localhost?
STEP 1: I will app start using Gretty plugin in gradle
STEP 2: I active the command "ng serve" (ionic serve) to run my ionic application
STEP 3: After both frontend and backend is successfully run, now I can access the provided link that generated from ng serve to access my web app and do anything I want.
Everything is working perfectly in local system, but it is different case when I test my ionic web app through my smartphone (Since ionic allows us to build progressive web app). The frontend ionic application will not able to communicate with backend when the operating environment of frontend is not in local system and I know it's really make sense, since my backend REST API haven't deploy which only able to operating on localhost. Therefore, I'm have tried to find solution on youtube and other internet sources to deploy my rest api online, but I don't see any information or deployment video that using the same technologies as I used to built my rest api (Spring MVC, oracle developer, gradle).
Thus, I'm asking this "stupid" question in here to find out whether any solution to deploy my rest api? or any suggestion to change the technologies that I used to built my rest api? or any mistakes I had made which violate the best coding practice in building rest api.
As a new programmer, I really appreciate the answers from all you guys. Thank you.
First, let's explain some concepts:
You backend is the application you coded, deployed on a server that exposes an endpoint for access - e.g. http://localhost:8080/yourApp - where your host/domain is your current computer (localhost) and the port is 8080 or anything you setup.
If you want to access from you smartphone:
1) Since your app is hosted on your pc, you need to be connected to the same wifi network
2) From your host machine, where you deployed your app, look for your ip address.
open your console/terminal
type ipconfig/ifconfig
look for your wifi and copy ipv4 address
3) redeploy your frontend pointing to your host machine ip
It worked before because you where on the same machine (localhost means redirect to your own device). When you switched to your phone it, also, redirects to your own smartphone.
The scenario is this: I'm developing a Java EE application with an Angular 2 frontend. The client has an Apache server which is usually used to serve static resources and an Oracle Weblogic for the dynamic part. The problem is that by default the Angular 2 App and the Weblogic server will not be able to talk each other due to the Same Origin Policy.
So far I have 3 possible deployment approaches in mind:
Set up a Reverse Proxy in Apache to point the REST endpoints to Weblogic
Package the Angular App in a WAR/EAR and deploy it to Weblogic. So I would end up with something like: myserver/myapp for the UI and myserver/myapp-rest for the Backend.
Package the Angular App in the same WAR as the Java backend. So I would end up with myserver/myapp for the UI and myserver/myapp/api for the REST endpoints.
There is a 4th option which would be setting up CORS, but I'm worried about the security using that approach.
Which is the right approach?
If you are allowed to make infra decisions , change apache webserver to nginx , we switched to nginx and got lot of added values in terms of concurrent processing.
In our project the angular client is served by nginx webserver which talks to java backend hosted on tomcat 8.x(our app server) , also there are couple of tiers after app-server a separate DB server and an elastic search server.
Don't feel intimidated to set up CORS, you will eventually need to allow some origins requests which don't originate on your domain and port.
If your java tech stack has spring mvc , then setting up CORS is just a matter of adding few lines of configuration. You can even hardcode your angular url to allow backend server to serve requests only from your angular URL.
In normal JavaEE world, CORS is just another filter or interceptor where you can set response headers with all the allowed origins, http methods etc. It's very simple you can look it up.
For your given choices
seems plausible and a value addition that you get is you can
delegate SSL encryption to proxy server .
seems rather odd, you would want to separate the static content server from dynamic contents server, your angular js bundles, assets
etc are mostly static, if you keep your static server separate then
you can configure cookie-less domains down the line that would make
serving a lot faster.
3 same as 2.
I would strongly suggest the CORS option , from my past experiences.
I'm not sure how one goes about using EasyPHP Webserver. Looking around the internet there doesn't seem to be a lot of materials on the matter. Whenever I try to run a php file from the www folder, a new blank tab appears without output from script code (Simple hello world echo). I'm not sure what the problem could be. My Http server and db server is running.
I'm also not sure if EasyPHP devserver is capable of going online. I'm currently in the middle of building an application that requires information to be sent to the server. My android application has been having trouble connecting to the EasyPHP devserver. Will I have more success with EasyPHP Webserver than I will with Devserver?
If you can make a success request using browser, then I think there will be no problem in Android.
Try to debug your webservice using tools like RestClient or PostManager.
Also, when connecting to webservice from Android application, I suggest using third party library like retrofit2. It's quite simple and we will never bothering with parsing json anymore.
In order to get the devserver running, you simply have to right click on the tray icon and select "Open Dashboard". There you can enable and set up all the services such as modules that you need. Please note that EasyPHP devserver is not designed to be used for a production server!
For performance and security reasons, I do strongly recommend to use Apache or nginx with the current stables of PHP 7.0.x and MySQL. If you need some help with that, feel free to ask me in a comment.
EasyPHP Webserver or Devserver are not a web server. It is a manager that installs Apache, PHP, MySQL, and other utilities, just like WAMP or XAMPP.
Just be sure to start the application that loads the Apache server before doing anything.
about your Android device connecting with the server, I'm not sure how that could be done, I have been more lucky using node, gulp and some scripts to generate a web server that is accessible to my devices in my local network.
I recently started developing my first web application with Spring and I'm stuck with a question I could not really find an answer to. What I have is a simple Spring MVC application running in tomcat which provides data in form of JSON, XML or binary via REST. This service is consumed by two clients I developed, a simple Java desktop application and an Android app. So far the clients only got information about new data by polling.
What I want now, is a way for the server to send notifications/messages to the clients when new data is available. For the Android client it would be good if the notifications could received anytime, not only when the app is currently open of course. I found lots of information for JavaScript client code but very little really useful, up-to date input about what the options for java and android clients are.
It would be really great if someone could give me some idea what would be the best way to achieve what I want (ideally something which integrates well with Spring on the server side), what protocols/libraries/frameworks to use, maybe even point me to some example or tutorial, how to implement this on server and client side.
Thanks in advance for any input.
For android or mobile devices, Google Cloud Messaging is the preferred way of sending messages to applications running on devices.
Example : spring gcm server side project and a sample tutorial.
For desktop apps, either poll regularly the server or run something in background like crontab or active-mq to check the messages and start the desktop app.
WebSockets are the best solution. check the implementation in java in the server side
Ok so I am still new to Objective C and currently learning it. I wanted to make an app where people can login and submit data to a database. I have research and found that I need to connect to a web server (I will use a Java web server) and from this server, it will communicate to the database server.
However, I am just wondering exactly how I would connect from an IPad app (that I will make in the future) to a Java App Server such as Glashfish. To do this, what kind of web app would I make (servlets?)? If I did, would I use the URL wrting method to transfer data?
I would want to use a http connection since I am using Glassfish.
Thanks
You can expose Restful API through the java web application; and access these api in your iOS app. There are many rest-client library for iOS now.
You can also write data to url connection directly, but it's tedious and complex.