In the last chapter of this series, I need to find a Starwars word related, in the response of an API, a rarely need, yes.
I have to find the word Luke in a known Starwars API, called Swapi, without IDEs, or frameworks but I’ll use the last chapter's pieces of knowledge
Having the next class:
public class SearchingInStarWarsFor {
    public static void main(String[] args) {
        if (args.length > 0)
            StarWarsWordFinder.searchingFor(args[0]);
    }
}
This StarWarsWordFinder has next specifications:
- Execute a request(GET) to the Swapi(people scope).
- It searches if the API body response would contain my searched word.
To achieve both objectives, I only need the JDK library that contains:
- 
java.net package that contains:
- URI → to adressing the request.
- 
http sub-package with:
- HttpClient → to send request and retrieve it response.
- HttpRequest → to build a request.
- HttpResponse → response object.
 
 
Getting a similar code like this:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class StarWarsWordFinder {
    static final String STARWARS_URL_PEOPLE_API = "https://swapi.dev/api/people";
    static int foundTimes = 0;
    public static void searchingFor(String word) {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest httpRequest = HttpRequest
                .newBuilder(URI.create(STARWARS_URL_PEOPLE_API))
                .GET()
                .build();
        httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
                      .thenApply(HttpResponse::body)
                        .thenAccept(results -> searchingIn(results, word))
                        .join();
        System.out.println(String.format("%s was found %s times", word,  foundTimes));
    }
    static void searchingIn(String results, String arg) {
        if (results.contains(arg))
            foundTimes++;
    }
}
I compile this source to generate a Library as explained in Creating a Java Library chapter, and I run the following terminal command:
java -cp .\starWarsWordFinder.jar .\SearchingInStarWarsFor.java Luke
#it prints
Luke was found 1 times
Let’s try with Yoda:
java -cp .\starWarsWordFinder.jar .\SearchingInStarWarsFor.java Yoda         
#it prints
Yoda was found 0 times
Oh! “Forget someone seems the API...”🤣
Let’s try with Vader:
java -cp .\starWarsWordFinder.jar .\SearchingInStarWarsFor.java Vader         
#it prints
Vader was found 1 times
“I’m your API Daddy...” Ok, enough of older StarWars jokes!
Let's try something else, backing to the code of the library. I could add an external library, to convert API string json response to an object, making it a little more specific in terms of only people's name scope.
The Gson library could parse the string response to a JSON.
Let’s see the source of StarWarsWordFinder code after adding Gson’s fromJson() method:
import com.google.gson.Gson;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
public class StarWarsWordFinderWithGson {
    //same as last version class
    static void searchingIn(String results, String arg) {
        Gson gson = new Gson();
        StarWarsPeople starWarsPeople = gson.fromJson(results, StarWarsPeople.class);
        for(StarWarsPerson starWarsPerson: starWarsPeople.getResults()) {
            if (starWarsPerson.getName().contains(arg))
                foundTimes++;
        }
    }
    class StarWarsPeople {
        private List<StarWarsPerson> results;
        public List<StarWarsPerson> getResults() {
            return results;
        }
    }
    class StarWarsPerson {
        private String name;
        public String getName() {
            return name;
        }
    }
}
It was necessary to create two additional classes:
- StarWarsPeople
- StarWarsPerson
To map the string results to the valid structure.
So, running the following commands:
javac -cp .\gson-2.9.0.jar  -d build .\StarWarsWordFinderWithGson.java #to get .class files
jar --create --file starWarsWordFinder.jar .\StarWarsWordFinderWithGson.class '.\StarWarsWordFinderWithGson$StarWarsPeople.class' 
'.\StarWarsWordFinderWithGson$StarWarsPerson.class' #to create the jar file
I get the new version of my library StarWarsWordFinderWithGson then I can run the main class, adding 2 jars, the gson and the starWarsWordFinder libraries:
java -cp "starWarsWordFinder.jar;gson-2.9.0.jar" .\SearchingInStarWarsWithGson.java Luke
#it prints
Luke was found 1 times
So, resuming this in a nutshell
- A word needs to be found.
- Identify tools inside JDK library to achivet it.
- Build a java library with it.
- Instance and call it inside our main program.
- Compile it and running it
- Make some starwars boring joke...ok. no.
This is the end of handmade series , I covered:
- Run a Java program with related jar.
- Create a jar.
- Build a service using a known framework.
- Consume an API, create a jar and use it to build a word finder java program.
I hope you enjoyed it like I enjoyed writing it. There are a lot more coming soon.
Tech stack
- Java 11.
- Windows 10.
Repo
 
 
              
 
    
Top comments (0)