我可以使用redux-api-middleware
获取txt文件吗?如果有,怎么样?根据{{3}},如果不符合application / JSON,则正文设置为undefined
,但我将得到的是一个简单的文本/简单
答案 0 :(得分:0)
redux-api-middleware指南
这个库的优点是可以处理许多与发出HTTP请求时调度多个动作相关的样板。为什么异步Redux涉及调度多个动作?
使用Redux操作表示请求的有状态
来自redux docs:
当您调用异步API时,有两个关键时刻:您开始通话的那一刻,以及您收到答案(或超时)的那一刻。 我们首先需要定义与为任何给定主题id进行异步调用外部资源相关联的动作及其创建者。
承诺有三种可能的状态代表API请求:
使用redux-api-middleware,我们创建一个动作并定义其他类型,然后由中间件本身调度。
示例强>
开始使用redux-api-middleware库时,您应该记住的主要事项是:
以下是一个自包含的示例:
import { createStore, applyMiddleware, combineReducers } from 'redux';
import { apiMiddleware, CALL_API } from 'redux-api-middleware';
import reducer from './reducer';
const REQUEST = 'REQUEST';
const RECEIVE = 'RECEIVE';
const FAILURE = 'FAILURE';
const store = createStore(reducer, {},
applyMiddleware(apiMiddleware)
);
const fetchAction ={
[CALL_API]: {
endpoint: 'http://www.example.com',
method: 'GET',
types: [
{
type: 'REQUEST',
payload: (action, state) => ({ action: state })
},
{
type: 'SUCCESS',
payload: (action, state, response) => {
return response
}
},
'FAILURE'
]
}
}
store.dispatch(fetchAction).then(res => {
console.log('success');
}).catch(e => {
console.log('failure');
});
在底层,基于promise isomorphic-fetch库用于发出HTTP请求。这意味着当我们使用redux-api-middleware认证的操作调用store.dispatch时, redux api中间件会返回一个承诺。
然后我们可以链接.then和.catch以使用我们想要的任何自定义逻辑来响应此请求的成功或失败。
答案 1 :(得分:0)
基本上,我所做的是更改fetch
操作并使用响应数据进行自定义。示例:
fetch: async (...args) => {
const response = await fetch(...args);
if (response.ok && response.status === 200) {
const reader = response.body.getReader();
const type = response.headers.get('content-type');
const filename = filenameExtractor(response.headers.get('content-disposition'));
const { value } = await reader.read();
fileSaver({ value, filename, type });
}
return response;
},
这段代码读取响应内容,并将其推送到浏览器中。 filenameExtractor
和fileSaver
是自定义函数。这种方式的响应不会改变。
使用这种方法,您可以进一步修改响应并自己创建json,以便将数据保存在redux中,例如:
const response = await fetch(...args);
return new Response(
JSON.stringify({ data: response.body })
);