Bael 5296: Added Http Request Header using the Feign Client (#12201)

* Implemented cassandra batch query

* Added netty version param

* Reformatted correctly

* Reformatted correctly

* Reformatted correctly

* Formatting fix resolved

* Formatting fix resolved

* Removed unused method

* Refactored method for better readability

* tab spaces corrected

* Added http headers in feign

* Updated code

* Updated code

* Removed unused code

* Removed unused logger code

* Implemented Interceptor and logging related code review

* Added AuthService Code

* Removed toString method

* Removed unnecessary declaration

* Removed new line

* Added feign headers log as well

* Moved to Authorisation package for better naming

* spaces removed

* @Override included

Co-authored-by: saikat chakraborty <saikat.chakraborty@tesco.com>
This commit is contained in:
Saikat Chakraborty 2022-05-27 13:58:56 +05:30 committed by GitHub
parent 4abe624ea6
commit 4b36bbf0b7
12 changed files with 293 additions and 1 deletions

View File

@ -0,0 +1,34 @@
package com.baeldung.feign.clients.builder;
import com.baeldung.feign.header.authorisation.ApiAuthorisationService;
import com.baeldung.feign.header.interceptor.AuthRequestInterceptor;
import feign.Feign;
import feign.Logger;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.slf4j.Slf4jLogger;
public class BookFeignClientBuilder {
public static <T> T createClient(Class<T> type, String uri) {
return Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.logger(new Slf4jLogger(type))
.logLevel(Logger.Level.HEADERS)
.target(type, uri);
}
public static <T> T createClientWithInterceptor(Class<T> type, String uri) {
return Feign.builder()
.requestInterceptor(new AuthRequestInterceptor(new ApiAuthorisationService()))
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.logger(new Slf4jLogger(type))
.logLevel(Logger.Level.HEADERS)
.target(type, uri);
}
}

View File

@ -0,0 +1,17 @@
package com.baeldung.feign.clients.header.dynamicheader;
import com.baeldung.feign.models.Book;
import feign.HeaderMap;
import feign.Headers;
import feign.RequestLine;
import java.util.Map;
@Headers("Content-Type: application/json")
public interface BookClient {
@RequestLine("POST")
void create(@HeaderMap Map<String, Object> headers, Book book);
}

View File

@ -0,0 +1,18 @@
package com.baeldung.feign.clients.header.staticheader;
import com.baeldung.feign.models.Book;
import com.baeldung.feign.models.BookResource;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
@Headers("Accept-Language: en-US")
public interface BookClient {
@RequestLine("GET /{isbn}")
BookResource findByIsbn(@Param("isbn") String isbn);
@RequestLine("POST")
@Headers("Content-Type: application/json")
void create(Book book);
}

View File

@ -0,0 +1,16 @@
package com.baeldung.feign.clients.header.staticheader.parameterized;
import com.baeldung.feign.models.BookResource;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
@Headers("x-requester-id: {requester}")
public interface BookClient {
@RequestLine("GET /{isbn}")
BookResource findByIsbn(@Param("requester") String requestorId, @Param("isbn") String isbn);
}

View File

@ -0,0 +1,11 @@
package com.baeldung.feign.header.authorisation;
import java.util.UUID;
public class ApiAuthorisationService implements AuthorisationService {
@Override
public String getAuthToken() {
return "Bearer " + UUID.randomUUID();
}
}

View File

@ -0,0 +1,7 @@
package com.baeldung.feign.header.authorisation;
public interface AuthorisationService {
String getAuthToken();
}

View File

@ -0,0 +1,22 @@
package com.baeldung.feign.header.interceptor;
import com.baeldung.feign.header.authorisation.AuthorisationService;
import feign.RequestInterceptor;
import feign.RequestTemplate;
public class AuthRequestInterceptor implements RequestInterceptor {
private AuthorisationService authTokenService;
public AuthRequestInterceptor(AuthorisationService authTokenService) {
this.authTokenService = authTokenService;
}
@Override
public void apply(RequestTemplate template) {
template.header("Authorisation", authTokenService.getAuthToken());
}
}

View File

@ -5,9 +5,10 @@
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern> </pattern>
</encoder> </encoder>
<logger name="feign.Logger" level="DEBUG" />
</appender> </appender>
<root level="INFO"> <root level="DEBUG">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
</root> </root>
</configuration> </configuration>

View File

@ -0,0 +1,38 @@
package com.baeldung.feign.clients.header.dynamicheader;
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
import com.baeldung.feign.models.Book;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* Consumes https://github.com/Baeldung/spring-hypermedia-api
*/
public class BookClientLiveTest {
private BookClient bookClient;
@Before
public void setup() {
bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
}
@Test
public void givenBookClient_shouldPostBook() throws Exception {
String isbn = UUID.randomUUID()
.toString();
Book book = new Book(isbn, "Me", "It's me!", null, null);
Map<String,Object> headerMap = new HashMap<>();
headerMap.put("metadata-key1", "metadata-value1");
headerMap.put("metadata-key2", "metadata-value2");
bookClient.create(headerMap, book);
}
}

View File

@ -0,0 +1,52 @@
package com.baeldung.feign.clients.header.interceptor;
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
import com.baeldung.feign.clients.header.staticheader.BookClient;
import com.baeldung.feign.models.Book;
import org.junit.Before;
import org.junit.Test;
import java.util.UUID;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* Consumes https://github.com/Baeldung/spring-hypermedia-api
*/
public class BookClientLiveTest {
private BookClient bookClient;
@Before
public void setup() {
bookClient = BookFeignClientBuilder.createClientWithInterceptor(BookClient.class, "http://localhost:8081/api/books");
}
@Test
public void givenBookClient_shouldFindOneBook() throws Exception {
Book book = bookClient.findByIsbn("0151072558")
.getBook();
assertThat(book.getAuthor(), containsString("Orwell"));
}
@Test
public void givenBookClient2_shouldFindOneBook() throws Exception {
Book book = bookClient.findByIsbn("0151072558")
.getBook();
assertThat(book.getAuthor(), containsString("Orwell"));
}
@Test
public void givenBookClient_shouldPostBook() throws Exception {
String isbn = UUID.randomUUID()
.toString();
Book book = new Book(isbn, "Me", "It's me!", null, null);
bookClient.create(book);
book = bookClient.findByIsbn(isbn)
.getBook();
assertThat(book.getAuthor(), is("Me"));
}
}

View File

@ -0,0 +1,45 @@
package com.baeldung.feign.clients.header.staticheader;
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
import com.baeldung.feign.models.Book;
import org.junit.Before;
import org.junit.Test;
import java.util.UUID;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* Consumes https://github.com/Baeldung/spring-hypermedia-api
*/
public class BookClientLiveTest {
private BookClient bookClient;
@Before
public void setup() {
bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
}
@Test
public void givenBookClient_shouldFindOneBook() throws Exception {
Book book = bookClient.findByIsbn("0151072558")
.getBook();
assertThat(book.getAuthor(), containsString("Orwell"));
}
@Test
public void givenBookClient_shouldPostBook() throws Exception {
String isbn = UUID.randomUUID()
.toString();
Book book = new Book(isbn, "Me", "It's me!", null, null);
bookClient.create(book);
book = bookClient.findByIsbn(isbn)
.getBook();
assertThat(book.getAuthor(), is("Me"));
}
}

View File

@ -0,0 +1,31 @@
package com.baeldung.feign.clients.header.staticheader.parameterized;
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
import com.baeldung.feign.models.Book;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
/**
* Consumes https://github.com/Baeldung/spring-hypermedia-api
*/
public class BookClientLiveTest {
private BookClient bookClient;
private String requester = "test";
@Before
public void setup() {
bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
}
@Test
public void givenBookClient_shouldFindOneBook() throws Exception {
Book book = bookClient.findByIsbn(requester, "0151072558")
.getBook();
assertThat(book.getAuthor(), containsString("Orwell"));
}
}