Skip to content
This repository has been archived by the owner on May 2, 2023. It is now read-only.
/ sparrow Public archive

Easy to use, modular HTTP client inspired by OpenFeign/feign

License

Notifications You must be signed in to change notification settings

masteryyh/sparrow

Repository files navigation

Sparrow HTTP Client

An modular, easy-to-use HTTP client inspired by Openfeign/feign.

Quick Start

Spring Boot Starter

  1. Add Spring Boot Starter dependency
<dependencies>
    <dependency>
        <groupId>win.minaandyyh.sparrow</groupId>
        <artifactId>sparrow-spring-boot-starter</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>
  1. Add @EnableSparrow annotation on main class
@SpringBootApplication
@EnableSparrow
public class AwesomeProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(AwesomeProjectApplication.class, args);
    }
}
  1. Define data model
@Data  // Lombok
public class Post {
    private Integer userId;
    
    private Integer id;
    
    private String title;
    
    private String body;
}
  1. Define your client interface
@SparrowClient(url = "https://jsonplaceholder.typicode.com")
public interface PostAPI {
    @Get(path = "/posts", produces = MediaType.APPLICATION_JSON)
    List<Post> all();
    
    @Get(path = "/post/{id}", produces = MediaType.APPLICATION_JSON)
    Post byId(@UrlVariable(name = "id") Integer id);
}
  1. Use this interface just like other Spring beans
@Service
public class SomeService {
    private final PostAPI postApi;
    
    @Autowired
    public SomeService(PostAPI postApi) {
        this.postApi = postApi;
    }
    
    // ...
    // Currently no java.util.Optional support, but it will be added later
    // Just for demonstration so no null-check present
    public Post getPost(Integer id) {
        return postApi.byId(id);
    }
}

Non-Spring project

  1. Add dependencies
<dependencies>
    <dependency>
        <groupId>win.minaandyyh</groupId>
        <artifactId>sparrow-core</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>win.minaandyyh</groupId>
        <artifactId>sparrow-jackson-codec</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>
  1. Define data model
@Data  // Lombok
public class Post {
    private Integer userId;
    
    private Integer id;
    
    private String title;
    
    private String body;
}
  1. Define your client interface
@SparrowClient(url = "https://jsonplaceholder.typicode.com")
public interface PostAPI {
    @Get(path = "/posts", produces = MediaType.APPLICATION_JSON)
    List<Post> all();
    
    @Get(path = "/post/{id}", produces = MediaType.APPLICATION_JSON)
    Post byId(@UrlVariable(name = "id") Integer id);
}
  1. Build client using Sparrow builder and use it somewhere
public class SomeAwesomeClass {
    // ...
    private final PostAPI postApi = Sparrow.<PostAPI>newClient()
            .encoder(new JacksonJsonEncoder())
            .decoder(new JacksonJsonDecoder())
            .client(PostAPI.class)
            .handler(JDKHttpClientRequestHandler.defaultHandler())
            .build();
    
    public Post getPost(Integer id) {
        return postApi.byId(id);
    }
}

License

This project is licensed under the Apache License, Version 2.0.

Roadmap

Currently WIP

  • Add java.util.Optional support for better null-safe capability.
  • Refactor request object process chain for better usage.

What's up next

  • Add logging and error handling capabilities.
  • Comply with IETF standards.
  • Integrate with Spring Cloud framework to enable microservices RPC capabilities.
  • Integrate with Spring Data for better paging capabilities.

About

Easy to use, modular HTTP client inspired by OpenFeign/feign

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages