如何通过ReactJS代码进行休息后调用?


126

我是ReactJS和UI的新手,我想知道如何从ReactJS代码进行基于REST的简单POST调用。

如果有任何示例,那将非常有帮助。


6
您能选择对您有帮助的答案吗?
苏格拉底

Answers:


215

直接来自React docs

fetch('https://mywebsite.com/endpoint/', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    firstParam: 'yourValue',
    secondParam: 'yourOtherValue',
  })
})

(这是发布JSON,但您也可以执行multipart-form。)


4
您必须安装并导入它。不要忘记,该fetch()函数不会返回数据,它只会返回一个promise
马尔沃里奥

1
哈哈@Divya,在阅读您的评论之前,我即将发表相同的评论。不知道是否将其放在React.createClass中。另外,我们可以链接到react docs吗?我尝试搜索他们的网站(facebook.github.io/react/docs/hello-world.html)失败。
泰勒L

1
我们可以修改原始答案以包括导入内容吗?
泰勒L

5
IMO,@ amann在下面有一个更好的答案。这个答案意味着fetchReact内置了它,实际上不是,而且没有指向所引用文档的链接。fetch(在撰写本文时)是基于Promise的实验性API。为了使浏览器兼容,您需要babel polyfill
克里斯(Chris)2007年

2
注意,这是来自React Native文档,而不是React JS文档,但是您也可以在React JS中使用Fetch_API。facebook.github.io/react-native/docs/network.html
布拉特伯格(PålBrattberg)

23

对于您如何进行REST调用,React并没有真正的看法。基本上,您可以为该任务选择所需的任何一种AJAX库。

使用普通的旧JavaScript的最简单方法可能是这样的:

var request = new XMLHttpRequest();
request.open('POST', '/my/url', true);
request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
request.send(data);

在现代浏览器中,您也可以使用fetch

如果您有更多可以进行REST调用的组件,则可以将此类逻辑放在可以在各个组件之间使用的类中。例如RESTClient.post(…)


5
对我来说,这是最好的答案,因为React没有内置任何内容。您必须导入fetchsuperagentjQueryaxios或不属于“ vanilla React”的其他内容,才能执行上述操作之外的任何其他操作。
vapcguy

看来,如果您使用的是烧瓶,则可以很好地完成工作JSON.stringify({"key": "val"}),然后再在烧瓶方面进行工作request.get_json()
Pro Q

是的,如果要发布JSON,则必须JSON.stringify先发布。
amann

19

另一个最近流行的软件包是:axios

安装: npm install axios --save

基于简单承诺的请求


axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

9

你可以安装超级代理

npm install superagent --save

然后拨打电话到服务器

import request from "../../node_modules/superagent/superagent";

request
.post('http://localhost/userLogin')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send({ username: "username", password: "password" })
.end(function(err, res){
console.log(res.text);
});  

5

从2018年开始,您还有一个更现代的选择是将异步/等待合并到ReactJS应用程序中。可以使用基于承诺的HTTP客户端库,例如axios。示例代码如下:

import axios from 'axios';
...
class Login extends Component {
    constructor(props, context) {
        super(props, context);
        this.onLogin = this.onLogin.bind(this);
        ...
    }
    async onLogin() {
        const { email, password } = this.state;
        try {
           const response = await axios.post('/login', { email, password });
           console.log(response);
        } catch (err) {
           ...
        }
    }
    ...
}

由于某种原因,没有的NodeJS解释await-SyntaxError: await is a reserved word (33:19)
prayagupd

@prayagupd您正在使用哪个版本的节点?
凯文·勒

5

我认为这种方式也是正常的方式。但是抱歉,我不能用英语来描述((

    submitHandler = e => {
    e.preventDefault()
    console.log(this.state)
    fetch('http://localhost:5000/questions',{
        method: 'POST',
        headers: {
            Accept: 'application/json',
                    'Content-Type': 'application/json',
        },
        body: JSON.stringify(this.state)
    }).then(response => {
            console.log(response)
        })
        .catch(error =>{
            console.log(error)
        })
    
}

https://googlechrome.github.io/samples/fetch-api/fetch-post.html

fetch('url / questions',{方法:'POST',标头:{接受:'application / json','Content-Type':'application / json',},正文:JSON.stringify(this.state) })。then(response => {console.log(response)}).catch(error => {console.log(error)})



0

这是一个为get和post都修改的util函数(堆栈上的另一篇文章)。制作Util.js文件。

let cachedData = null;
let cachedPostData = null;

const postServiceData = (url, params) => {
    console.log('cache status' + cachedPostData );
    if (cachedPostData === null) {
        console.log('post-data: requesting data');
        return fetch(url, {
            method: 'POST',
            headers: {
              'Accept': 'application/json',
              'Content-Type': 'application/json',
            },
            body: JSON.stringify(params)
          })
        .then(response => {
            cachedPostData = response.json();
            return cachedPostData;
        });
    } else {
        console.log('post-data: returning cachedPostData data');
        return Promise.resolve(cachedPostData);
    }
}

const getServiceData = (url) => {
    console.log('cache status' + cachedData );
    if (cachedData === null) {
        console.log('get-data: requesting data');
        return fetch(url, {})
        .then(response => {
            cachedData = response.json();
            return cachedData;
        });
    } else {
        console.log('get-data: returning cached data');
        return Promise.resolve(cachedData);
    }
};

export  { getServiceData, postServiceData };

在另一个组件中的用法如下

import { getServiceData, postServiceData } from './../Utils/Util';

constructor(props) {
    super(props)
    this.state = {
      datastore : []
    }
  }

componentDidMount = () => {  
    let posturl = 'yoururl'; 
    let getdataString = { name: "xys", date:"today"};  
    postServiceData(posturl, getdataString)
      .then(items => { 
        this.setState({ datastore: items }) 
      console.log(items);   
    });
  }

-4

这是一个例子:https : //jsfiddle.net/69z2wepo/9888/

$.ajax({
    type: 'POST',
    url: '/some/url',
    data: data
  })
  .done(function(result) {
    this.clearForm();
    this.setState({result:result});   
  }.bind(this)
  .fail(function(jqXhr) {
    console.log('failed to register');
  });

它使用了jquery.ajax方法,但是您可以轻松地将其替换为基于AJAX的库,例如axios,superagent或fetch。


非常感谢这个例子:)。我还想了解我的服务是否需要JSON格式的数据。那么需要进行哪些更改?任何种类的信息都将非常有帮助。因此,当我使用curl命令敲击端点时,就像curl -v -X POST localhost:8080 / myapi / ui / start -d'{“ Id”:“ 112”,“ User”:“ xyz”}'所以我怎么称呼这样的服务。
Divya

创建一个名为data的变量,'{"Id":"112","User":"xyz"}'并将URL更改为localhost:8080 / myapi / ui / start,仅此而已,一旦XHR调用成功,您将进入done方法中,并可以通过结果访问数据属性。
Sanyam Agrawal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.