RestServer und Service manuell implementieren

lam_tr

Top Contributor
Hallo zusammen,

hat jemand gute Tutorials oder Beispiele wie man ein Rest Server und dazu auch die Services erstellen kann.

Bisher habe ich immer per Spring Web das gemacht, ist super einfach, aber Lerneffekt ist kaum da. Um das Ganze ein bisschen per experimentieren zu können, möchte ich das selber implementieren.

Was wäre da zu beachten?

Wie kann ich einen Rest Service betreiben?

Grüße
lam
 

lam_tr

Top Contributor
Ich hatte vor ein paar Tage einen Mock Rest Server gebraucht, habe keine für mich ansprechenende Anwendung gefunden um meine Rest Request zu testen.

Deswegen möchte ich so eine Anwendung schreiben.

Dazu muss ich unter anderen auch wissen wie man
* Http Server aufsetzt
* Wie man ein Rest Service in den Server integriert

Nachtrag:
Okay der erste Punkt ist an sich nicht so schwer wie ich gedacht habe https://dzone.com/articles/simple-http-server-in-java
 

lam_tr

Top Contributor
absgesehen von em Wiremock. Wenn ich jetzt einen HTTP Server gestartet habe, kann ich auf dem laufenden Server einen Rest Service installieren?
 

lam_tr

Top Contributor
Was verstehst du unter "einen Rest Service"? Und was möchtest du genau selber machen?

Ich will descriptive ein Rest Resource Path definieren und in dieser Konfiguration auch sagen was zurückgegeben werden soll, wenn es aufgerufen wird. Weiter will ich in der Konfiguration auch sagen wie der HTTP Server hochgefahren wird. An sich will ich das ein bisschen wie bei Spring Boot in der application.properties sagen welchen Host oder Port der Server anneehmen soll und der RestController werden dann von dem Server betrieben.

An folgende Beispiel sagt, wieviele Resource Pfade ich habe und wie ich darauf zugreifen kann per get, post, etc.

Beispiel einer Konfigurationsdatei:

Code:
Konfiguration{

  host: Wert;

  port: Wert;

  resources{

     get{

          path: "/data/contacts"

     }

     post{ }

     put{}

     ...

}

Meine Frage war, wenn ich zur Laufzeit mehrere get resourcen zu der Konfig hinzufüge, kann ich das dem Server sagen, er soll sofort annehmen, das wäre doch ein Hotdeploy oder?
 

sascha-sphw

Top Contributor
Ich will Dir das jetzt nicht ausreden, ich finde "learning by doing" ist die beste Art sich etwas beizubringen. Ich würde Dir nur empfehlen Dich Schritt für Schritt von einfach zu komplex zu bewegen. Anhand Deiner Fragen, würde ich Dir aktuell empfehlen entweder das Framework zu verwenden (wenn es Dir nur ums Testen geht), oder mit einer leichteren Übung zu starten (wenn es Dir ums Lernen geht). Mocking Frameworks sind, wie ich finde, nicht unbedingt etwas mit dem man Starten sollte, die sind meistens extrem generisch und das ist für Anfänger meist nicht ganz trivial.

Hier ein Beispiel wie Du mit WireMock arbeiten würdest.
XML:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.0</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.tomakehurst/wiremock-jre8 -->
<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock-jre8</artifactId>
    <version>2.26.3</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ru.lanwen.wiremock/wiremock-junit5 -->
<dependency>
    <groupId>ru.lanwen.wiremock</groupId>
    <artifactId>wiremock-junit5</artifactId>
    <version>1.3.1</version>
    <scope>test</scope>
</dependency>
Java:
package any.package.you.like;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import ru.lanwen.wiremock.ext.WiremockResolver;
import ru.lanwen.wiremock.ext.WiremockUriResolver;

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;

@ExtendWith({
        WiremockResolver.class,
        WiremockUriResolver.class
})
public class SampleTest {

    @Test
    public void helloworldTest(@WiremockResolver.Wiremock WireMockServer server, @WiremockUriResolver.WiremockUri String uri) {

        server.stubFor(WireMock.get(WireMock.urlPathEqualTo("/hello"))
                .willReturn(WireMock.aResponse()
                        .withStatus(200)
                        .withHeader("Content-Type", MediaType.TEXT_PLAIN)
                        .withBody("world")));

        String response = ClientBuilder.newClient()
                .target(uri)
                .path("/hello")
                .request(MediaType.TEXT_PLAIN)
                .get(String.class);
        Assertions.assertEquals("world", response);
    }
}
 

lam_tr

Top Contributor
A
Ich will Dir das jetzt nicht ausreden, ich finde "learning by doing" ist die beste Art sich etwas beizubringen. Ich würde Dir nur empfehlen Dich Schritt für Schritt von einfach zu komplex zu bewegen. Anhand Deiner Fragen, würde ich Dir aktuell empfehlen entweder das Framework zu verwenden (wenn es Dir nur ums Testen geht), oder mit einer leichteren Übung zu starten (wenn es Dir ums Lernen geht). Mocking Frameworks sind, wie ich finde, nicht unbedingt etwas mit dem man Starten sollte, die sind meistens extrem generisch und das ist für Anfänger meist nicht ganz trivial.

Hier ein Beispiel wie Du mit WireMock arbeiten würdest.
XML:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.0</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.tomakehurst/wiremock-jre8 -->
<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock-jre8</artifactId>
    <version>2.26.3</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ru.lanwen.wiremock/wiremock-junit5 -->
<dependency>
    <groupId>ru.lanwen.wiremock</groupId>
    <artifactId>wiremock-junit5</artifactId>
    <version>1.3.1</version>
    <scope>test</scope>
</dependency>
Java:
package any.package.you.like;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import ru.lanwen.wiremock.ext.WiremockResolver;
import ru.lanwen.wiremock.ext.WiremockUriResolver;

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;

@ExtendWith({
        WiremockResolver.class,
        WiremockUriResolver.class
})
public class SampleTest {

    @Test
    public void helloworldTest(@WiremockResolver.Wiremock WireMockServer server, @WiremockUriResolver.WiremockUri String uri) {

        server.stubFor(WireMock.get(WireMock.urlPathEqualTo("/hello"))
                .willReturn(WireMock.aResponse()
                        .withStatus(200)
                        .withHeader("Content-Type", MediaType.TEXT_PLAIN)
                        .withBody("world")));

        String response = ClientBuilder.newClient()
                .target(uri)
                .path("/hello")
                .request(MediaType.TEXT_PLAIN)
                .get(String.class);
        Assertions.assertEquals("world", response);
    }
}
Alles klar, ich schau mal wie weit ich komme. Danke
 

Ähnliche Java Themen


Oben