Skip to content

Commit 5b03414

Browse files
saikatcse03saikat chakraborty
andauthored
Bael 5296: Added Http Request Header using the Feign Client (eugenp#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 <[email protected]>
1 parent 1f60a51 commit 5b03414

File tree

12 files changed

+293
-1
lines changed

12 files changed

+293
-1
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.feign.clients.builder;
2+
3+
import com.baeldung.feign.header.authorisation.ApiAuthorisationService;
4+
import com.baeldung.feign.header.interceptor.AuthRequestInterceptor;
5+
6+
7+
import feign.Feign;
8+
import feign.Logger;
9+
import feign.gson.GsonDecoder;
10+
import feign.gson.GsonEncoder;
11+
import feign.slf4j.Slf4jLogger;
12+
13+
14+
public class BookFeignClientBuilder {
15+
16+
public static <T> T createClient(Class<T> type, String uri) {
17+
return Feign.builder()
18+
.encoder(new GsonEncoder())
19+
.decoder(new GsonDecoder())
20+
.logger(new Slf4jLogger(type))
21+
.logLevel(Logger.Level.HEADERS)
22+
.target(type, uri);
23+
}
24+
25+
public static <T> T createClientWithInterceptor(Class<T> type, String uri) {
26+
return Feign.builder()
27+
.requestInterceptor(new AuthRequestInterceptor(new ApiAuthorisationService()))
28+
.encoder(new GsonEncoder())
29+
.decoder(new GsonDecoder())
30+
.logger(new Slf4jLogger(type))
31+
.logLevel(Logger.Level.HEADERS)
32+
.target(type, uri);
33+
}
34+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.feign.clients.header.dynamicheader;
2+
3+
import com.baeldung.feign.models.Book;
4+
5+
import feign.HeaderMap;
6+
import feign.Headers;
7+
import feign.RequestLine;
8+
9+
import java.util.Map;
10+
11+
@Headers("Content-Type: application/json")
12+
public interface BookClient {
13+
14+
@RequestLine("POST")
15+
void create(@HeaderMap Map<String, Object> headers, Book book);
16+
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.baeldung.feign.clients.header.staticheader;
2+
3+
import com.baeldung.feign.models.Book;
4+
import com.baeldung.feign.models.BookResource;
5+
import feign.Headers;
6+
import feign.Param;
7+
import feign.RequestLine;
8+
9+
@Headers("Accept-Language: en-US")
10+
public interface BookClient {
11+
12+
@RequestLine("GET /{isbn}")
13+
BookResource findByIsbn(@Param("isbn") String isbn);
14+
15+
@RequestLine("POST")
16+
@Headers("Content-Type: application/json")
17+
void create(Book book);
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.baeldung.feign.clients.header.staticheader.parameterized;
2+
3+
import com.baeldung.feign.models.BookResource;
4+
5+
import feign.Headers;
6+
import feign.Param;
7+
import feign.RequestLine;
8+
9+
10+
@Headers("x-requester-id: {requester}")
11+
public interface BookClient {
12+
13+
@RequestLine("GET /{isbn}")
14+
BookResource findByIsbn(@Param("requester") String requestorId, @Param("isbn") String isbn);
15+
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.baeldung.feign.header.authorisation;
2+
3+
import java.util.UUID;
4+
5+
public class ApiAuthorisationService implements AuthorisationService {
6+
7+
@Override
8+
public String getAuthToken() {
9+
return "Bearer " + UUID.randomUUID();
10+
}
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.feign.header.authorisation;
2+
3+
public interface AuthorisationService {
4+
5+
String getAuthToken();
6+
7+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.feign.header.interceptor;
2+
3+
import com.baeldung.feign.header.authorisation.AuthorisationService;
4+
import feign.RequestInterceptor;
5+
import feign.RequestTemplate;
6+
7+
8+
public class AuthRequestInterceptor implements RequestInterceptor {
9+
10+
private AuthorisationService authTokenService;
11+
12+
public AuthRequestInterceptor(AuthorisationService authTokenService) {
13+
this.authTokenService = authTokenService;
14+
}
15+
16+
@Override
17+
public void apply(RequestTemplate template) {
18+
template.header("Authorisation", authTokenService.getAuthToken());
19+
}
20+
}
21+
22+

feign/src/main/resources/logback.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
66
</pattern>
77
</encoder>
8+
<logger name="feign.Logger" level="DEBUG" />
89
</appender>
910

10-
<root level="INFO">
11+
<root level="DEBUG">
1112
<appender-ref ref="STDOUT" />
1213
</root>
1314
</configuration>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.feign.clients.header.dynamicheader;
2+
3+
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
4+
import com.baeldung.feign.models.Book;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
import java.util.UUID;
11+
12+
/**
13+
* Consumes https://github.com/Baeldung/spring-hypermedia-api
14+
*/
15+
public class BookClientLiveTest {
16+
17+
private BookClient bookClient;
18+
19+
@Before
20+
public void setup() {
21+
bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
22+
}
23+
24+
@Test
25+
public void givenBookClient_shouldPostBook() throws Exception {
26+
String isbn = UUID.randomUUID()
27+
.toString();
28+
29+
Book book = new Book(isbn, "Me", "It's me!", null, null);
30+
31+
Map<String,Object> headerMap = new HashMap<>();
32+
33+
headerMap.put("metadata-key1", "metadata-value1");
34+
headerMap.put("metadata-key2", "metadata-value2");
35+
36+
bookClient.create(headerMap, book);
37+
}
38+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.baeldung.feign.clients.header.interceptor;
2+
3+
import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
4+
import com.baeldung.feign.clients.header.staticheader.BookClient;
5+
import com.baeldung.feign.models.Book;
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
9+
import java.util.UUID;
10+
11+
import static org.hamcrest.CoreMatchers.containsString;
12+
import static org.hamcrest.CoreMatchers.is;
13+
import static org.junit.Assert.assertThat;
14+
15+
/**
16+
* Consumes https://github.com/Baeldung/spring-hypermedia-api
17+
*/
18+
public class BookClientLiveTest {
19+
20+
private BookClient bookClient;
21+
22+
@Before
23+
public void setup() {
24+
bookClient = BookFeignClientBuilder.createClientWithInterceptor(BookClient.class, "http://localhost:8081/api/books");
25+
}
26+
27+
@Test
28+
public void givenBookClient_shouldFindOneBook() throws Exception {
29+
Book book = bookClient.findByIsbn("0151072558")
30+
.getBook();
31+
assertThat(book.getAuthor(), containsString("Orwell"));
32+
}
33+
34+
@Test
35+
public void givenBookClient2_shouldFindOneBook() throws Exception {
36+
Book book = bookClient.findByIsbn("0151072558")
37+
.getBook();
38+
assertThat(book.getAuthor(), containsString("Orwell"));
39+
}
40+
41+
@Test
42+
public void givenBookClient_shouldPostBook() throws Exception {
43+
String isbn = UUID.randomUUID()
44+
.toString();
45+
Book book = new Book(isbn, "Me", "It's me!", null, null);
46+
bookClient.create(book);
47+
48+
book = bookClient.findByIsbn(isbn)
49+
.getBook();
50+
assertThat(book.getAuthor(), is("Me"));
51+
}
52+
}

0 commit comments

Comments
 (0)