无法对来自 Web Api 的 return 数据作出反应
Trouble getting react to return data from Web Api
我已经按照一些相当基础的教程设置了一个基本的 Web Api 服务和一个 React TS 应用程序来使用它,但是当我的 React 组件调用 WebApi 服务时,我可以看到 Web Api 进入并 returns 数据 - 就像我在浏览器中输入 API url 一样,它 returns 是正确的items JSON,但在 React 的 javascript 代码中,当 promise 从 fetch 返回时,HTTP 响应似乎不包含任何数据,只是一个空的 200 响应。
即response.data未定义。
这一定是一些非常基本的东西我做错了——正如我提到的,当你在浏览器中输入 API url 时,你会在浏览器。那么为什么我的反应代码不能理解响应?
我的网站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
在我看来,问题出在你的反应组件的 fetch
部分。您在第一个 then
回调中得到的是 Response object.
为了从中获取数据,您需要调用其中一种方法(return 一个承诺)。在您的情况下,由于响应包含 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);
}
)
我已经按照一些相当基础的教程设置了一个基本的 Web Api 服务和一个 React TS 应用程序来使用它,但是当我的 React 组件调用 WebApi 服务时,我可以看到 Web Api 进入并 returns 数据 - 就像我在浏览器中输入 API url 一样,它 returns 是正确的items JSON,但在 React 的 javascript 代码中,当 promise 从 fetch 返回时,HTTP 响应似乎不包含任何数据,只是一个空的 200 响应。
即response.data未定义。
这一定是一些非常基本的东西我做错了——正如我提到的,当你在浏览器中输入 API url 时,你会在浏览器。那么为什么我的反应代码不能理解响应?
我的网站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
在我看来,问题出在你的反应组件的 fetch
部分。您在第一个 then
回调中得到的是 Response object.
为了从中获取数据,您需要调用其中一种方法(return 一个承诺)。在您的情况下,由于响应包含 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);
}
)