Làm thế nào để thực hiện một cuộc gọi bài còn lại từ mã ReactJS?


126

Tôi chưa quen với ReactJS và UI và tôi muốn biết cách thực hiện một cuộc gọi POST dựa trên REST đơn giản từ mã ReactJS.

Nếu có bất kỳ ví dụ nào, nó sẽ thực sự hữu ích.


6
Bạn có thể vui lòng chọn câu trả lời giúp bạn không?
Socrates

Câu trả lời:


215

Trực tiếp từ các tài liệu React :

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

(Đây là đăng bài JSON, nhưng bạn cũng có thể làm, ví dụ, dạng nhiều phần.)


4
Bạn phải cài đặt nó và nhập nó . Đừng quên, fetch()hàm không trả về dữ liệu , nó chỉ trả về một lời hứa .
Malvolio

1
haha @Divya, tôi cũng sắp đưa ra nhận xét tương tự trước khi đọc bài của bạn. Không chắc chắn có hay không đặt nó trong React.createClass. Ngoài ra, chúng tôi có thể vui lòng có một liên kết đến các tài liệu phản ứng không? Tôi đã cố gắng tìm kiếm trang web của họ ( facebook.github.io/react/docs/hello-world.html ) không thành công.
Tyler L

1
Chúng tôi có thể vui lòng sửa đổi câu trả lời ban đầu để bao gồm nhập khẩu không?
Tyler L

5
IMO, @amann có câu trả lời tốt hơn dưới đây . Câu trả lời này ngụ ý fetchđược tích hợp vào React, nhưng không phải vậy, và không có liên kết đến các tài liệu được tham chiếu. fetchlà (tại thời điểm viết) một API dựa trên Promise thử nghiệm . Để tương thích với trình duyệt, bạn sẽ cần một polyfill babel .
chris

2
Lưu ý rằng đây là từ các tài liệu React Native, không phải các tài liệu React JS, nhưng bạn cũng có thể sử dụng Fetch_API trong React JS. facebook.github.io/react-native/docs/network.html
Pål Brattberg

23

React không thực sự có ý kiến ​​về cách bạn thực hiện các cuộc gọi REST. Về cơ bản, bạn có thể chọn bất kỳ loại thư viện AJAX nào bạn thích cho nhiệm vụ này.

Cách dễ nhất với JavaScript cũ đơn giản có lẽ là như thế này:

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

Trong các trình duyệt hiện đại, bạn cũng có thể sử dụng fetch.

Nếu bạn có nhiều thành phần tạo ra các lệnh gọi REST, có thể có ý nghĩa khi đưa loại logic này vào một lớp có thể được sử dụng trên các thành phần. Ví dụRESTClient.post(…)


5
Đối với tôi, đây là câu trả lời tốt nhất, bởi vì Phản ứng không có bất cứ điều gì được xây dựng trong. Bạn có thể phải nhập khẩu fetchhoặc superagenthoặc jQueryhoặc axioshoặc một cái gì đó khác mà không phải là một phần của "vanilla Phản ứng" để làm bất cứ điều gì khác so với những gì được đăng tải trên .
vapcguy

Có vẻ như nếu bạn đang sử dụng bình, nó hoạt động tốt JSON.stringify({"key": "val"})và sau đó về phía bình làmrequest.get_json()
Pro Q

Đúng, nếu bạn đang đăng JSON, JSON.stringifytrước tiên bạn phải đăng nó.
amann

19

Một gói khác phổ biến gần đây là: axios

Tải về : npm install axios --save

Yêu cầu dựa trên Promise đơn giản


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

9

bạn có thể cài đặt superagent

npm install superagent --save

sau đó thực hiện cuộc gọi bài đến máy chủ

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

Kể từ năm 2018 trở đi, bạn có một tùy chọn hiện đại hơn đó là kết hợp async / await trong ứng dụng ReactJS của bạn. Có thể sử dụng thư viện máy khách HTTP dựa trên lời hứa như axios. Mã mẫu được đưa ra dưới đây:

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) {
           ...
        }
    }
    ...
}

vì một số lý do, nodejs không diễn giải await-SyntaxError: await is a reserved word (33:19)
nguyện

@prayagupd bạn đang sử dụng phiên bản nút nào?
Kevin Lê - Khnle

5

Tôi nghĩ cách này cũng là một cách bình thường. Nhưng xin lỗi, tôi không thể mô tả bằng tiếng Anh ((

    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

tìm nạp ('url / câu hỏi', {phương thức: 'POST', tiêu đề: {Chấp nhận: 'application / json', 'Loại nội dung': 'application / json',}, body: JSON.opesify (this.state) }). sau đó (hồi đáp => {console.log (phản hồi)}) .catch (error => {console.log (error)})



0

Đây là một chức năng được sửa đổi (một bài đăng khác trên stack) để lấy và đăng cả hai. Tạo tập tin 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 };

Cách sử dụng như dưới đây trong một thành phần khác

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

Dưới đây là một ví dụ: 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');
  });

Nó đã sử dụng jquery.ajaxphương thức nhưng bạn có thể dễ dàng thay thế nó bằng các lib dựa trên AJAX như axios, superagent hoặc fetch.


Cảm ơn rất nhiều cho ví dụ :). Tôi cũng muốn hiểu nếu dịch vụ của tôi mong đợi dữ liệu định dạng JSON. Sau đó, những thay đổi nào sẽ được yêu cầu? Bất kỳ loại thông tin sẽ thực sự hữu ích. Vì vậy, khi tôi đang sử dụng lệnh curl để nhấn vào điểm cuối giống như curl -v -X POST localhost: 8080 / myapi / ui / start -d '{"Id": "112", "Người dùng": "xyz"}' vậy làm thế nào tôi có thể gọi một dịch vụ như vậy.
Divya

tạo một biến được gọi là dữ liệu với '{"Id":"112","User":"xyz"}'và thay đổi URL thành localhost: 8080 / myapi / ui / start, đó là về nó, một khi cuộc gọi XHR thành công, bạn sẽ tiếp tục theo phương thức đã thực hiện và bạn sẽ có quyền truy cập vào dữ liệu của mình thông qua kết quả bất động sản.
Sanyam Agrawal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.