Hejka!
Ćwiczę połączenie dwóch usług typu REST.
Co chciałem osiągnąć:
do pierwszej usługi przychodzi:
curl -d '{"author":"Author", "content":"Content"}' -X POST localhost:8080/api/addmessage
Pierwsza usługa łączy się z drugą:curl -X GET localhost:8080/api/newid
, pobiera nowyID
i dodaje nowymessage
do listymessages
Podałem polecenia curl
, żeby było jasne co chciałem osiągnąć ;)
To taki najprostszy przykład do przećwiczenia symbiozy dwóch usług.
Mam sobie usługę w formie:
public class First {
private final int port = 8080;
private ResponseFactory factory = new ResponseFactory();
private List<Message> messages = new ArrayList<>();
private Gson gson = new Gson();
public First() {
System.out.println("Starting First at port: " + port);
port(port);
messages.add(new Message(0, "Author", "Content"));
path("/api", () -> {
get("/messages", (request, response) ->
factory.standardResponse(response, messages),
gson::toJson);
post("/addmessage", (request, response) -> {
// Connect to localhost:8081/api/newid
// parse id from json
// and add new message
factory.standardResponse(response, "nothing yet");
});
});
after("/*", (request, response) ->
response.type("application/json"));
}
}
oraz drugą wyglądającą tak:
public class Second {
private final int port = 8081;
private Gson gson = new Gson();
private AtomicInteger ids = new AtomicInteger(0);
public Second() {
System.out.println("Starting Second at port: " + port);
port(port);
path("/api", () ->
get("/newid", (request, response) ->
factory.standardResponse(response, new ID(ids.incrementAndGet())),
gson::toJson));
after("/*", (request, response) -> response.type("application/json"));
}
}
Klasa ID:
public class ID {
public final int id;
public ID(int id) {
this.id = id;
}
}
Klasa Message:
public class Message {
public final int id;
public final String author;
public final String content;
public Message(int id, String author, String content) {
this.id = id;
this.author = author;
this.content = content;
}
}
ResponseFactory wygląda następująco:
ublic class ResponseFactory {
public StandardResponse standardResponse(Response response, Object data) {
return new StandardResponse(response.status(), data);
}
private class StandardResponse {
private int status;
private Object data;
public StandardResponse(int status, Object data) {
this.status = status;
this.data = data;
}
}
}
służy jako klasa odpowiedzi, ładnie wtedy Gson sobie wszystko zamienia na Jsona.
Pytania:
- Czy potrzebuję klienta REST, żeby móc otrzymać nowy id?
- Czy
Spark
ma jakieś wbudowane sposoby (nic w docsach nie znalazłem)? - Z jakiego klienta skorzystać? Z jakich bibliotek najczęściej się korzysta w tego typu problemach?