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

原文链接:Finding Luke through the command line by consuming an API

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容