Motivation
Typescript-powered library for making HTTP requests integrated with redux.
- Configure HTTP requests with fluent interface and use it for running request or dispatching an action
- Process successfull and error responses and status codes without writing boilerplate code
- Creates actions for running HTTP request and automatically dispatches actions for successfull and error results
- Provides a set of type guards for checking action types
Using without redux
Perform GET request with parameters:
import { http } from "rd-redux-http";
interface Post {
userId: number;
id: number;
title: string;
body: string;
}
const getPostByIdRequest = http.get<{ postId: number }>("https://jsonplaceholder.typicode.com/posts/:postId")
.resultFromJson<Post>()
.build();
getPostByIdRequest({ postId: 1})
.then(response => {
if (response.ok) {
console.log(response.result);
} else {
}
});
Perform POST request with body:
import { http } from "rd-redux-http";
interface Post {
userId: number;
id: number;
title: string;
body: string;
}
interface PostValidationError {
[field: string]: string;
}
const createPostRequest = http.put<{ postId: number }>("https://jsonplaceholder.typicode.com/posts/:postId")
.jsonBody<Post>()
.resultFromJson<Post, PostValidationError>()
.build();
createPost({ postId: 1 }, {
id: 1,
title: "test",
body: "body",
userId: 1
})
.then(response => {
if (response.ok) {
} else {
if (response.errorType === "response") {
console.log(response.error["title"]);
}
}
});
Using with redux
import { http } from "rd-redux-http";
import { reduxHttpMiddlewareFactory } from "rd-redux-http/redux";
import { applyMiddleware, compose, createStore } from "redux";
const mw = reduxHttpMiddlewareFactory();
const store = createStore(
compose(
applyMiddleware(
mw
)
)
);
const createPostRequest = mw.register(
http.put<{ postId: number }>("https://jsonplaceholder.typicode.com/posts/:postId")
.jsonBody<Post>()
.resultFromJson<Post, PostValidationError>()
.build()
);
store.dispatch(
createPostRequest.run({ postId: 1}, {
id: 1,
userId: 1,
title: "title",
body: "body"
})
);
function createPostReducer(state: CreatePostRequestState, action: Action): CreatePostRequestState {
if (createPostRequest.isRunning(action)) {
return {
...state,
isLoading: true,
error: undefined
};
}
if (createPostRequest.isOk(action)) {
return {
data: action.result,
isLoading: false,
error: undefined,
message: `Post with ID ${action.result.id} created`
};
}
if (createPostRequest.isError(action)) {
if (createPostRequest.isErrorResponse(action)) {
return {
...state,
isLoading: false,
error: action.error,
message: "Error occured due creating a post"
};
} else {
return {
...state,
isLoading: false,
error: "An error occured due creating a post"
};
}
}
}