จะโทรออกโพสต์ที่เหลือจากรหัส ReactJS ได้อย่างไร?


126

ฉันยังใหม่กับ ReactJS และ UI และฉันต้องการทราบวิธีสร้างการโทร POST แบบ REST แบบง่ายๆจากโค้ด ReactJS

หากมีตัวอย่างมานำเสนอคงจะเป็นประโยชน์จริงๆ


6
คุณช่วยเลือกคำตอบที่ช่วยคุณได้ไหม
Socrates

คำตอบ:


215

ตรงจากเอกสารตอบสนอง :

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

(นี่คือการโพสต์ JSON แต่คุณสามารถทำได้เช่นฟอร์มหลายส่วน)


4
คุณจะต้องติดตั้งและนำเข้า อย่าลืมที่fetch()ฟังก์ชั่นไม่ได้กลับข้อมูลก็แค่ส่งกลับสัญญา
Malvolio

1
ฮ่าฮ่า @Divya ฉันเพิ่งจะแสดงความคิดเห็นเดียวกันก่อนที่จะอ่านของคุณ ไม่แน่ใจว่าจะใส่ใน React.createClass หรือไม่ นอกจากนี้เราขอลิงค์ไปยังเอกสารตอบกลับได้ไหม ฉันพยายามค้นหาไซต์ของพวกเขา ( facebook.github.io/react/docs/hello-world.html ) ไม่สำเร็จ
Tyler L

1
เราสามารถแก้ไขคำตอบเดิมเพื่อรวมการนำเข้าได้หรือไม่
Tyler L

5
IMO, @amann มีคำตอบที่ดีด้านล่าง คำตอบนี้หมายความว่าfetchมีอยู่ใน React ซึ่งไม่ใช่และไม่มีลิงก์ไปยังเอกสารที่อ้างถึง fetchคือ (ในขณะที่เขียน) ทดลองสัญญาตาม API สำหรับเบราว์เซอร์ที่เข้ากันได้คุณจะต้องpolyfill Babel
chris

2
โปรดทราบว่านี่มาจากเอกสาร React Native ไม่ใช่เอกสาร React JS แต่คุณสามารถใช้ Fetch_API ใน React JS ได้เช่นกัน facebook.github.io/react-native/docs/network.html
Pål Brattberg

23

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(…)


5
สำหรับฉันนี่เป็นคำตอบที่ดีที่สุดเพราะ React ไม่มีอะไรในตัวคุณต้องนำเข้าfetchหรือsuperagentหรือjQueryหรือaxiosหรืออย่างอื่นที่ไม่ใช่ส่วนหนึ่งของ "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

คุณสามารถติดตั้ง 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);
});  

5

ตั้งแต่ปี 2018 เป็นต้นไปคุณมีตัวเลือกที่ทันสมัยกว่าซึ่งรวม async / await ไว้ในแอปพลิเคชัน 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 คุณใช้ node รุ่นอะไร
Kevin Le - Khnle

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

ดึงข้อมูล ('url / questions', {method: 'POST', headers: {Accept: 'application / json', 'Content-Type': 'application / json',}, body: JSON.stringify (this.state) }) แล้ว (response => {console.log (response)}) .catch (error => {console.log (error)})


2

นี่คือรายการการเปรียบเทียบไลบรารีของ ajax ตามคุณสมบัติและการสนับสนุน ฉันชอบใช้การดึงข้อมูลสำหรับการพัฒนาฝั่งไคลเอ็นต์เท่านั้นหรือการดึงข้อมูลแบบ isomorphicเพื่อใช้ในการพัฒนาทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับisomorphic-fetch vs fetch


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

-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วิธีการ แต่คุณสามารถแทนที่ได้อย่างง่ายดายด้วย libs ที่ใช้ 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 สำเร็จคุณจะเข้าสู่วิธีการที่ทำเสร็จแล้วและคุณจะสามารถเข้าถึงข้อมูลของคุณผ่านผลลัพธ์ คุณสมบัติ
Sanyam Agrawal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.