Edee.one · Dokumentace

Edee http client

Jednoduše použitelný http klient pro základní http komunikaci.

Výhody použití:

  • jednoduché API (do budoucna snadno zaměnitelné za Java HTTP Client)
  • plný monitoring http zpráv pro diagnostiku
  • konfigurovatelnost pomocí edee mechanismu

Pro složitější použití (asynchronní přístup, nebo přímé stream zpracování) je vhodnější používat robustnější knihovny jako je Apache HttpClient.

API

Klient používá 3 základní třídy

Požadavek - EdeeHttpRequest

Reprezentace http požadavku konstruovaném pomocí statických factory metod a s využitím builder pattern přístupu.

java
request = EdeeHttpRequest.get("https://www.edee.one")        .headers("Accept","application/json")        .parameters("url","https://fg.cz");

Odpověď - EdeeHttpResponse

Reprezentace zpracované odpovědi na http požadavek. Obsahuje primárně navrácený obsah, stav odpovědi a http hlavičky odpovědi.

java
int status = response.getStatusCode();InputStream body = response.getResponseBody();

EdeeHttpClient

Http klient obsahující metodu send pro odeslání požadavku (EdeeHttpRequest) synchronně vracející zpracovanou odpověd (EdeeHttpResponse).

java
response = httpClient.send(request);

Instance klienta je přímo získatelná z HttpClientProvider, implementačně využívá Apache HttpClient.

Příklady použití

Základní volání GET a zpracování odpovědi

java
@AutowiredHttpClientProvider provider;
final EdeeHttpClient client = provider.getEdeeHttpClient("myModuleName");
final EdeeHttpRequest request = EdeeHttpRequest.get(myUrlValue).parameters("param","value");final EdeeHttpResponse response = client.send(request);// status 200 checkif (response.isStatusCodeOk()) {    System.out.println(response.getResponseBodyAsString());}

POST Spring resource na url

java
final EdeeHttpRequest put = EdeeHttpRequest        .put("https://httpbin.org/put")        .resource(new ByteArrayResource(bytes));final EdeeHttpResponse response = client.send(put);

Práce s http hlavičkami

java
final EdeeHttpRequest get = EdeeHttpRequest.get("https://httpbin.org/headers")        .headers("Accept","application/json")        .headers("Content-Type","application/json")        .headers("x-edee-my-header","VALUE");final EdeeHttpResponse response = client.send(get);
// optional header processingString server = response.getFirstHeaderValue("Server").orElse("unknown");if (response.getFirstHeaderValue("Location").isPresent()) { // redirected}// all header values as ListList<String> allPossibleServerValues = response.getHeaderValues("Server");

Definice basic autorizace

java
final EdeeHttpRequest request =         EdeeHttpRequest.get("https://httpbin.org/basic-auth/foo/bar")            .credentials(new Credentials("foo","bar"));final EdeeHttpResponse response = client.send(request);

Přetížení nastavení klienta

java
final EdeeHttpRequest request = EdeeHttpRequest.get("http://edee.one:81")        .timeout(Duration.ofSeconds(2)) // custom timeout        .followRedirects(false); // disable redirects

Test podpora

Pro potřeby unit testů zle získat mock implementaci http klienta, která vrací předem definované odpovědi. Neprovádí tedy reálné HTTP požadavky, ale vrací předem definované obekty, které interně drží ve statické mapě.

Ve Spring unit testu stačí přidat com.fg.httpclient.test.HttpClientProviderMockConfig configuration bean a pomocí statických metod na EdeeHttpClientMock nadefinovat očekáváné http odpovědi.

Pokud pro klienta s požadovaným jménem bude existovat taková konfigurace, vytvoří provider MOCK implementaci.

java
@ContextConfiguration(    // init provider with mocking support    classes = HttpClientProviderMockConfig.class)@RunWith(SpringJUnit4ClassRunner.class)public class EdeeHttpClientMockTest extends EdeeHttpClientTest {
    @BeforeClass    public static void initHttpMock() {        // response with string content        EdeeHttpClientMock.mockStringResponse("test-edee","https://edee.one","OK");        // response with binary content        EdeeHttpClientMock.mockResourceResponse("test-edee","https://edee.one/file",springResource);        // status code response        EdeeHttpClientMock.mockStatusResponse("test-edee","https://www.edee.one/non-exists", 404);        // more specific response with Supplier        EdeeHttpClientMock.mockResponse("test-edee", HTTP_BIN_BASE + "/redirect-to",                () -> EdeeHttpResponseMock.builder()                        .statusCode(302)                        .header("Location", Collections.singletonList("http://fg.cz"))                        .build());    }
    @AfterClass    public static void clearHttpMock() {        // clear static responses setup        EdeeHttpClientMock.clearClientMock("test-edee");    }
}