从 ReactJS 调用 REST Web 服务

Posted

技术标签:

【中文标题】从 ReactJS 调用 REST Web 服务【英文标题】:Calling a REST webservice from ReactJS 【发布时间】:2017-02-18 12:20:24 【问题描述】:

我试图调用 REST Web 服务从数据库中获取数据并将 JSON 对象返回给 ReactJS 应用程序。当我从浏览器访问 URL 时,它会显示 JSON 对象,但是当我尝试在其中呈现数据时表格没有内容显示。

我的示例代码如下所示

import React from 'react';
import $ from 'jquery'; 

export default class Members extends React.Component 
  constructor(props) 
    super(props);
    this.state =  users: [] ;
  

  componentDidMount() 
    $.ajax(
      url: "http://localhost:8080/users"
    ).then(function(data) 
        this.setState(
                    users:data
        );
    );
    
  render() 
    return (
     <UsersList users=this.state.users/>
    )
  


class UsersList extends React.Component 
    render() 
        var users = this.props.users.map(users =>
            <User key=user._links.self.href user=user/>
        );
        return (
            <table>
                <tbody>
                    <tr>
                        <th>First Name</th>
                        <th>Last Name</th>
                    </tr>
                    users
                </tbody>
            </table>
        )
    

class User extends React.Component 
    render() 
        return (
            <tr>
                <td>this.props.user.firstName</td>
                <td>this.props.user.lastName</td>
            </tr>
        )
    

这是异步加载的问题吗?

【问题讨论】:

请问consolecomponentDidMount中的数据是什么?数据是什么? 跨源请求被阻止:同源策略不允许读取localhost:8080/users 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。这是控制台输出 您使用哪种服务器端语言?如果是 nodejs 和 express 使用 npmjs.org/package/cors 包 【参考方案1】:

这可能会迟到,但我发现您的用户映射方法中对项目的变量引用存在问题。

这是你的代码

class UsersList extends React.Component 
  render() 
    var users = this.props.users.map(users =>
   <User key=user._links.self.href user=user/>
);

...

应该是这样的

class UsersList extends React.Component 
  render() 
    var users = this.props.users.map(user =>
   <User key=user._links.self.href user=user/>
);

...

注意map函数中变量名从“users”改为“user”。

【讨论】:

【参考方案2】:

@Alireza:感谢您的帮助。 我能够从当前看起来像

的服务中获取 JSON 对象

  "_embedded" : 
    "users" : [ 
      "firstName" : "Harshal",
      "lastName" : "Patil",
      "location" : "ABC",
      "userId" : "USR_1",
      "_links" : 
        "self" : 
          "href" : "#urlLink"
        ,
        "user" : 
          "href" : "#urlLink"
        
      
     ]
  ,
  "_links" : 
    "self" : 
      "href" : "#urlLink"
    ,
    "profile" : 
      "href" : "#urlLink"
    
  

我已经使用 Spring Data Rest 进行 Web 服务实现,并且了解超媒体标头 (HAL) 包含在 json 对象中。在 React 应用程序中呈现时,有什么方法可以忽略这些标头数据? 目前 JSON 对象在解析时在第 2 行抛出错误。

【讨论】:

【参考方案3】:

根据this 问题,JSONP 或“带填充的 JSON”是一种在 Web 浏览器中运行的 javascript 程序中使用的通信技术,用于从不同域中的服务器请求数据,这是典型的 Web 浏览器所禁止的,因为相同 -原产地政策。 JSONP 利用了浏览器不对脚本标签强制执行同源策略这一事实。请注意,要使 JSONP 工作,服务器必须知道如何使用 JSONP 格式的结果进行回复。 JSONP 不适用于 JSON 格式的结果。尝试在 Ajax 调用中使用 JSONP。它将绕过同源策略。像这样:

  componentDidMount() 
    $.ajax(
      url: "http://localhost:8080/users",
      async:true,
      dataType : 'jsonp'   //you may use jsonp for cross origin request
      crossDomain:true,
    ).then(function(data) 
        this.setState(
                    users:data
        );
    );
    

*** 上的好答案:jQuery AJAX cross domain

【讨论】:

以上是关于从 ReactJS 调用 REST Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JavaScript 调用 REST Web 服务 API?

从 Android 调用使​​用 Spring Security 保护的 REST Web 服务

从 ASP.net 4 Web API 2 项目通过 HttpClient 调用 REST 服务导致异常

无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求

ReactJS 应用程序无法使用 REST API 调用获取数据

Django REST API 作为后端,ReactJS 作为前端集成