Java: Web requests
The following outlines how to perform a web request using the standard networking library. If you wish to use a 3rd party library, the unirest Lightweight HTTP Request Client Libraries look quite good. I'd recommend using the unirest library if you have to do any non-trivial requests such as post data, handling cookies, authentication, file upload/download etc.
There are generally going to be two parts to successfully achieving your web request.
- Load the data from a web API (usually in JSON format).
- Parse the data you received to extract the information you want.
There are a lot of competing Java JSON libraries around. I've used org.json
which is available at:
- URL: https://github.com/stleary/JSON-java
- Maven: org.json:json
Example
package ch.isl.beyondbasics;
import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;
import java.net.*; // URL reading
import java.io.*; // URL reading
import org.json.*; // JSON parsing
public class WebRequestDemo {
public static String makeRequest(String url) {
String charset = java.nio.charset.StandardCharsets.UTF_8.name();
String result = "";
try {
URL myURL = new URL(url);
URLConnection connection = myURL.openConnection();
connection.setRequestProperty("Accept-Charset", charset);
connection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
result = result + inputLine + "\n";
in.close();
}
catch (Exception e) {
System.out.println("*** EXCEPTION ***");
System.out.println(e.getClass().toString());
System.out.println(e.getMessage());
}
return result;
}
public static void printNextSpaceXFlights(String jsonString) {
// Fetch relevant details from JSON data
JSONObject jo = new JSONObject(jsonString);
String missionName = jo.getString("mission_name");
long launchEpoch = jo.getLong("launch_date_unix");
LocalDateTime ldt = LocalDateTime.ofInstant(Instant.ofEpochMilli(launchEpoch*1000), ZoneId.systemDefault());
String launchDateTime = Integer.toString(ldt.getHour()) + ":"
+ Integer.toString(ldt.getMinute()) + " on "
+ Integer.toString(ldt.getDayOfMonth()) + " "
+ ldt.getMonth().name() + ", "
+ Integer.toString(ldt.getYear());
String rocket = jo.getJSONObject("rocket").getString("rocket_name");
String launchSite = jo.getJSONObject("launch_site").getString("site_name_long");
String details = jo.getString("details");
// Print the information
System.out.println("The next scheduled SpaceX launch is:");
System.out.println("Mission: "+missionName);
System.out.println("Launch date/time: "+launchDateTime);
System.out.println("Launch site: "+launchSite);
System.out.println("Rocket: "+rocket);
System.out.println("Briefing: "+details);
}
public static void printDogPicUrls(String jsonString) {
// Fetch relevant details from JSON data
JSONArray ja = new JSONArray(jsonString);
for (int i=0; i<ja.length(); i++) {
String datum = ja.getString(i);
System.out.println(datum);
}
}
public static void main(String[] args) {
String url, result;
// First demo... next SpaceX flight details
url = "https://api.spacexdata.com/v2/launches/next";
result = makeRequest(url);
printNextSpaceXFlights(result);
// Second demo... a list of dog pictures
url = "http://shibe.online/api/shibes?count=5&urls=true&httpsUrls=false";
result = makeRequest(url);
printDogPicUrls(result);
}
}
Remember to include the JSON library JAR file in your class path when compiling and executing
javac -d bin -cp bin:lib/* src/ch/isl/beyondbasics/WebRequestDemo.java
java -cp bin:lib/* ch.isl.beyondbasics.WebRequestDemo
References
URL loading
- https://docs.oracle.com/javase/tutorial/networking/urls/index.html
- https://stackoverflow.com/a/2793153 - How to use java.net.URLConnection to fire and handle HTTP requests. Contains helpful tips for sending headers, making POST v GET requests, uploading files etc.
- http://hc.apache.org/httpcomponents-client-ga/quickstart.html - An alternative library that may be worth looking at
JSON parsing using org.json
:
- JavaDocs: https://stleary.github.io/JSON-java/
- https://www.baeldung.com/java-org-json
- https://www.codevoila.com/post/65/java-json-tutorial-and-example-json-java-orgjson
- https://github.com/stleary/JSON-java
- http://theoryapp.com/parse-json-in-java/
Another library I was thinking of using was org.json.simple
. I ended up not using it because it looks like it hasn't been updated in over 7 years, so I worry about it being a dead project.
- JavaDocs: http://alex-public-doc.s3.amazonaws.com/json_simple-1.1/index.html
- https://www.mkyong.com/java/json-simple-example-read-and-write-json/
- https://code.google.com/archive/p/json-simple/downloads
- https://www.geeksforgeeks.org/parse-json-java/
Finally, anotherone that could be worth looking at is
- https://github.com/ralfstx/minimal-json
Note:
When searching for tutorials and documentation, be careful to search for "parsing" JSON. You will find a lot of Java tools that refer to serialising/deserialsing objects, or that make reference to pojo (plain-old-java-objects). For simple parsing of data received from a web api, these will be more complex than your needs.