DEV Community

Cover image for Finding Luke through the command line by consuming an API
Thinking out code
Thinking out code

Posted on

Finding Luke through the command line by consuming an API

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]);
    }
}
Enter fullscreen mode Exit fullscreen mode

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:

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++;
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Let’s try with Yoda:

java -cp .\starWarsWordFinder.jar .\SearchingInStarWarsFor.java Yoda         
#it prints
Yoda was found 0 times
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

“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;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

I hope you enjoyed it like I enjoyed writing it. There are a lot more coming soon.

Tech stack

  • Java 11.
  • Windows 10.

Repo

https://github.com/JesusIgnacio/starwars-word-finder

Top comments (0)