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.
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.
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).
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
@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
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
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
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
final EdeeHttpRequest request = EdeeHttpRequest.get("http://edee.one:81") .timeout(Duration.ofSeconds(2)) // custom timeout .followRedirects(false); // disable redirectsTest 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.
@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"); }
}