我已经按照一些相当基本的教程来设置基本的Web Api服务和使用该服务的React TS应用程序,但是当我的react组件调用WebApi服务时,我可以看到Web Api介入并返回了数据-就像我在浏览器中输入API URL一样,它返回正确的项目JSON,但是在React的javascript代码中,当承诺从抓取中返回时,HTTP响应似乎不包含任何数据,只是空200响应。
即response.data未定义。
这肯定是我做错的最基本的事情-就像我在浏览器中输入API网址时提到的那样,您在浏览器中看到了正确的JSON。那么,为什么我的React代码无法理解响应?
我的网络API
[EnableCors("*", "*", "*")]
public class ItemsController : ApiController
{
private readonly Item[] _items = {
new Item
{
...
},
new Item
{
...
},
new Item
{
...
},
};
public HttpResponseMessage Get()
{
return Request.CreateResponse(HttpStatusCode.OK, _items);
}
public HttpResponseMessage Get(long id)
{
var item= _items.FirstOrDefault(t => t.ItemId == id);
if (item== null)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Not found");
}
return Request.CreateResponse(HttpStatusCode.OK, item);
}
}
我的反应组件
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import '../../App.css';
import IStoreState from '../../interfaces/IStoreState';
import Item from '../../model/item';
import { getItemsReceivedAction } from './actions';
interface IItemsProps {
items: Item[],
itemsUpdated: (items:Item[]) => void
}
class Trades extends React.Component<IItemsProps> {
constructor(props:IItemsProps) {
super(props);
}
public componentDidMount() {
fetch('http://localhost:58675/api/items', {
headers: {
Accept: 'application/json',
},
method: 'GET'
}).then((t:any) =>
{
const results = t;
this.props.itemsUpdated(results.data);
} );
}
public render() {
return (
<div>
{this.props.items} items displayed
</div>
);
}
}
const mapDispatchToProps = (dispatch:Dispatch) => {
return {
itemsUpdated: (items:Item[]) => dispatch(getItemsReceivedAction(items))
}
}
function mapStateToProps(state:IStoreState) {
return {
items: state.viewingItems
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Items);
编辑:下面的javascript结果对象
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "cors"
url: "http://localhost:58675/api/items"
__proto__: Response
答案 0 :(得分:0)
在我看来,问题出在反应组件的fetch
部分。在第一个then
回调中得到的是一个Response object。
为了从中获取数据,您需要调用其中的一种方法(返回promise)。在您的情况下,由于响应包含json,因此您需要调用json()
方法。之后,您链接另一个then
,在其中操作已解析的数据:
fetch('http://localhost:58675/api/items', {
headers: {
Accept: 'application/json',
},
method: 'GET'
}).then((t:any) =>
{
return t.json(); // <-- this part is missing
}
).then((t:any) =>
{
const results = t;
this.props.itemsUpdated(results.data);
}
)