ReactJS kodundan dinlenme sonrası araması nasıl yapılır?


126

ReactJS ve UI'de yeniyim ve ReactJS kodundan basit bir REST tabanlı POST çağrısının nasıl yapılacağını öğrenmek istedim.

Herhangi bir örnek varsa, gerçekten yardımcı olacaktır.


6
Lütfen size yardımcı olan cevabı seçer misiniz?
Sokrates

Yanıtlar:


215

Doğrudan React belgelerinden :

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

(Bu JSON yayınlamaktır, ancak örneğin multipart-form da yapabilirsiniz.)


4
Yüklemeniz ve içe aktarmanız gerekir . Unutmayın, fetch()işlev verileri döndürmez, sadece bir söz verir .
Malvolio

1
haha @ Divya, ben de seninkini okumadan önce aynı yorumu yapmak üzereydim. React.createClass'a koyup koymayacağınızdan emin değilim. Ayrıca, lütfen react belgelerine bir bağlantı verebilir miyiz? Başarısız bir şekilde sitelerini ( facebook.github.io/react/docs/hello-world.html ) aramaya çalıştım .
Tyler L

1
İçe aktarımı içerecek şekilde orijinal yanıtı değiştirebilir miyiz?
Tyler L

5
IMO, @amann'ın aşağıda daha iyi bir cevabı var . Bu yanıt, fetchReact'te yerleşik olmadığı ve referans verilen belgelerle bağlantı bulunmadığı anlamına gelir . fetch(yazarken) deneysel bir Promise tabanlı API'dir . Tarayıcı uyumluluğu için bir babel polyfill'e ihtiyacınız olacak .
chris

2
Bunun React JS belgelerinden değil, React Native belgelerinden olduğuna dikkat edin, ancak Fetch_API'yi React JS'de de kullanabilirsiniz. facebook.github.io/react-native/docs/network.html
Pål Brattberg

23

React'in REST aramalarını nasıl yaptığınız konusunda gerçekten bir fikri yok. Temel olarak, bu görev için istediğiniz türden AJAX kitaplığını seçebilirsiniz.

Eski düz JavaScript ile en kolay yol muhtemelen şuna benzer:

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

Modern tarayıcılarda da kullanabilirsiniz fetch .

REST çağrıları yapan daha fazla bileşene sahipseniz, bu tür bir mantığı, bileşenler arasında kullanılabilecek bir sınıfa koymak mantıklı olabilir. ÖrneğinRESTClient.post(…)


5
Bana göre bu en iyi cevap çünkü React'te yerleşik bir şey yok. Yukarıda yayınlananlardan başka bir şey yapmak için ya içeri aktarmanız fetchya superagentda jQueryya axiosda ya da "vanilla React" in parçası olmayan başka bir şey yapmanız gerekiyor. .
vapcguy

Görünüşe göre, şişesi kullanıyorsanız, bunu yapmak JSON.stringify({"key": "val"})ve sonra şişe tarafında yapmak iyi çalışıyorrequest.get_json()
Pro Q

Evet, JSON gönderiyorsanız, JSON.stringifyönce bunu yapmanız gerekir .
amann

19

Son zamanlarda popüler olan bir başka paket ise: axios

Yüklemek : npm install axios --save

Basit Söz temelli istekler


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

9

süper ajan yükleyebilirsin

npm install superagent --save

sonra sunucuya arama sonrası yapmak için

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 ve sonrasında, ReactJS uygulamanıza async / await'i dahil etmek için daha modern bir seçeneğiniz var. Aksiyolar gibi vaat temelli bir HTTP istemci kitaplığı kullanılabilir. Örnek kod aşağıda verilmiştir:

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

bazı nedenlerden dolayı nodejs yorumluyor await-SyntaxError: await is a reserved word (33:19)
2018

@prayagupd hangi düğüm sürümünü kullanıyorsunuz?
Kevin Le - Khnle

5

Bunun da normal bir yol olduğunu düşünüyorum. Ama üzgünüm, İngilizce olarak tanımlayamıyorum ((

    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 / sorular', {yöntem: 'POST', başlıklar: {Kabul: 'application / json', 'Content-Type': 'application / json',}, gövde: JSON.stringify (this.state) }). sonra (response => {console.log (response)}) .catch (error => {console.log (hata)})



0

Her ikisini de almak ve göndermek için değiştirilmiş bir util işlevi (yığın üzerinde başka bir gönderi). Util.js dosyası oluşturun.

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

Başka bir bileşende aşağıdaki gibi kullanım

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

İşte bir örnek: 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.ajaxYöntemi kullandı, ancak onu axios, süper ajan veya getirme gibi AJAX tabanlı kitaplarla kolayca değiştirebilirsiniz.


Örnek için çok teşekkürler :). Ayrıca servisimin JSON format verisi bekleyip beklemediğini anlamak istedim, o zaman ne gibi değişiklikler gerekecek? Her türlü bilgi gerçekten yardımcı olacaktır. Bu nedenle, uç noktaya ulaşmak için curl komutunu kullandığımda, curl -v -X POST localhost: 8080 / myapi / ui / start -d '{"Id": "112", "User": "xyz"}' gibi peki böyle bir servisi nasıl arayabilirim.
Divya

data adlı bir değişken oluşturun '{"Id":"112","User":"xyz"}'ve URL'yi localhost: 8080 / myapi / ui / start olarak değiştirin, bununla ilgili, XHR çağrısı başarılı olduktan sonra bitmiş yönteme ineceksiniz ve sonuç üzerinden verilere erişebileceksiniz. Emlak.
Sanyam Agrawal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.