无法做出反应以从Web Api返回数据

时间:2019-01-07 12:13:45

标签: javascript reactjs asp.net-web-api2

我已经按照一些相当基本的教程来设置基本的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

1 个答案:

答案 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);
        }
    )