Spark i połączenie z inną usługą REST

0

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 nowy ID i dodaje nowy message do listy messages

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?
1

Jeśli chodzi o robienie requestów HTTP w swoim serwisie javowych to popularny jest RestTemplate ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1