¿Cómo hacer una llamada de descanso después del código ReactJS?

126

Soy nuevo en ReactJS y UI y quería saber cómo hacer una simple llamada POST basada en REST desde el código ReactJS.

Si hay algún ejemplo presente, sería realmente útil.

Divya
fuente
66
¿Podrías elegir la respuesta que te ayudó?
Sócrates

Respuestas:

215

Directamente de los documentos React :

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

(Esto está publicando JSON, pero también podría hacer, por ejemplo, formulario multiparte).

Malvolio
fuente
44
Tienes que instalarlo e importarlo . No olvide que la fetch()función no devuelve los datos , solo devuelve una promesa .
Malvolio
1
jaja @Divya, estaba a punto de hacer el mismo comentario antes de leer el tuyo. No estoy seguro de si ponerlo o no en React.createClass. Además, ¿podríamos tener un enlace a los documentos de reacción? Traté de buscar su sitio ( facebook.github.io/react/docs/hello-world.html ) sin éxito.
Tyler L
1
¿Podemos modificar la respuesta original para incluir la importación?
Tyler L
55
OMI, @amann tiene una mejor respuesta a continuación . Esta respuesta implica que fetchestá integrada en React, que no es así, y no hay ningún enlace a los documentos a los que se hace referencia. fetches (al momento de escribir) una API experimental basada en Promise . Para compatibilidad con el navegador, necesitará un polyfill de babel .
Chris
2
Tenga en cuenta que esto es de los documentos React Native, no de los documentos React JS, pero también puede usar Fetch_API en React JS. facebook.github.io/react-native/docs/network.html
Pål Brattberg
23

React realmente no tiene una opinión sobre cómo hacer llamadas REST. Básicamente, puede elegir el tipo de biblioteca AJAX que desee para esta tarea.

La forma más fácil con JavaScript antiguo es probablemente algo como esto:

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

En los navegadores modernos también puede usar fetch.

Si tiene más componentes que hacen llamadas REST, podría tener sentido colocar este tipo de lógica en una clase que se pueda usar en todos los componentes. P.ejRESTClient.post(…)

amann
fuente
55
Para mí, esta es la mejor respuesta, porque Reaccionar no tiene nada incorporado. Usted tiene que importar fetcho superagento jQueryo axioso alguna otra cosa que no forma parte de la "vainilla React" con el fin de hacer otra cosa que lo que se publica por encima de cualquier .
vapcguy
Parece que si está usando un matraz, funciona bien JSON.stringify({"key": "val"})y luego, en el lado del matraz, haga lo siguienterequest.get_json()
Pro Q
Sí, si estás publicando JSON, debes JSON.stringifyhacerlo primero.
amann
19

Otro paquete recientemente popular es: axios

Instalar en pc : npm install axios --save

Promesa simple basada en solicitudes


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

puedes instalar superagent

npm install superagent --save

luego para hacer una llamada posterior al servidor

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);
});  
Chandrakant Thakkar
fuente
5

A partir de 2018 y más allá, tiene una opción más moderna que es incorporar async / await en su aplicación ReactJS. Se puede utilizar una biblioteca de cliente HTTP basada en promesas, como axios. El código de muestra se proporciona a continuación:

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) {
           ...
        }
    }
    ...
}
Kevin Le - Khnle
fuente
por alguna razón, nodejs interpreta await-SyntaxError: await is a reserved word (33:19)
prayagupd
@prayagupd ¿qué versión de nodo estás usando?
Kevin Le - Khnle
5

Creo que de esta manera también es normal. Pero lo siento, no puedo describir en inglés ((

    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 / preguntas', {método: 'POST', encabezados: {Aceptar: 'application / json', 'Content-Type': 'application / json',}, body: JSON.stringify (this.state) }). luego (respuesta => {console.log (respuesta)}) .catch (error => {console.log (error)})

Señor divertido
fuente
2

Aquí hay una lista de la comparación de bibliotecas ajax basada en las características y el soporte. Prefiero usar fetch solo para el desarrollo del lado del cliente o isomorphic-fetch para usar tanto en el desarrollo del lado del cliente como del lado del servidor.

Para obtener más información sobre isomorphic-fetch vs fetch

user3603575
fuente
0

Aquí hay una función de utilidad modificada (otra publicación en la pila) para obtener y publicar ambas. Hacer el archivo 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 };

Uso como a continuación en otro componente

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);   
    });
  }
Shailesh Gavathe
fuente
-4

Aquí hay un ejemplo: 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');
  });

Utilizó el jquery.ajaxmétodo, pero puede reemplazarlo fácilmente con bibliotecas basadas en AJAX como axios, superagent o fetch.

Sanyam Agrawal
fuente
Muchas gracias por el ejemplo :). También quería entender si mi servicio espera datos en formato JSON. Entonces, ¿qué cambios serían necesarios? Cualquier tipo de información sería realmente útil. Entonces, cuando estoy usando el comando curl para alcanzar el punto final, es como curl -v -X POST localhost: 8080 / myapi / ui / start -d '{"Id": "112", "User": "xyz"}' Entonces, ¿cómo puedo llamar a ese servicio?
Divya
cree una variable llamada datos con '{"Id":"112","User":"xyz"}'y cambie la URL a localhost: 8080 / myapi / ui / start, eso es todo, una vez que la llamada XHR sea exitosa, aterrizará en el método hecho y tendrá acceso a sus datos a través del resultado propiedad.
Sanyam Agrawal