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

时间:2016-07-21 17:24:03

标签: reactjs react-jsx reactjs-flux reactjs-native

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

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

感谢。

10 个答案:

答案 0 :(得分:150)

直接来自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。)

答案 1 :(得分:18)

React对于如何进行REST调用并没有真正的意见。基本上,您可以选择任何类型的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(…)

答案 2 :(得分:9)

你可以安装superagent

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

答案 3 :(得分:9)

另一个最近流行的套餐是:axios

安装:npm install axios --save

基于简单承诺的请求

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

答案 4 :(得分:4)

截至2018年及以后,您有一个更现代的选择,即在您的ReactJS应用程序中包含async / await。可以使用基于承诺的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) {
           ...
        }
    }
    ...
}

答案 5 :(得分:2)

Here是基于功能和支持的ajax库比较列表。 我更喜欢仅将fetch用于客户端开发,或者isomorphic-fetch用于客户端和服务器端开发。

有关isomorphic-fetch vs fetch

的更多信息

答案 6 :(得分:1)

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

    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(响应)             })             .catch(错误=> {                 console.log(错误)             })

答案 7 :(得分:1)

这里是在 reactjs 中定义和调用 post API 的简单方法。使用命令 axios 安装 npm install axios 并在任何地方调用 post req 方法,它将返回包含 100 个元素的数组。

// Define post_req() Method in authAction.js

import axios from 'axios';

const post_req = (data) => {
return new Promise((resolve, reject) => {
const url = 'https://jsonplaceholder.typicode.com/posts'
const header = {
    "Access-Control-Allow-Origin": "*",
    "Content-Type: application/json"
}
axios({
    method: 'post',
    url: url,
    data: data,
    headers: header
 });
 .then((res)=>{resolve(res);})
 .catch((err)=>{reject(err);})
 })
}

// Calling post_req() Method in react component 
import React, { Component } from 'react';
import { post_req } from 'path of file authAction.js'

class MyReactComponent extends Component {
constructor(props) {
super(props);
this.state = {
 myList:[]
 };
}
componentDidMount() {
let data = {
 .......
 } 
 this.props.post_req(data)
 .then((resp)=>{this.setState({myList:resp.data})})
 .catch((err)=>{console.log('here is my err',err)})
}
render() {
return (
  <div>
    ....
  </div)
 }
}
export default MyReactComponent;

答案 8 :(得分:0)

这里是修改后的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);   
    });
  }

答案 9 :(得分:-6)

以下是一个示例: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)轻松替换它。