ReactJS 코드에서 휴식 후 전화를 거는 방법?


126

나는 ReactJS와 UI를 처음 접했고 ReactJS 코드에서 간단한 REST 기반 POST 호출을 만드는 방법을 알고 싶었습니다.

예제가 있으면 실제로 도움이 될 것입니다.


6
도움이되는 답변을 선택해 주시겠습니까?
소크라테스

답변:


215

는 직선에서 문서 반응 :

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과 같은 작업을 수행 할 수도 있습니다.)


4
당신은 할 필요 를 설치하고 가져 . 잊지 말고, fetch()함수는 데이터를 반환하지 않고 단지 promise를 반환합니다 .
Malvolio

1
haha @Divya, 나는 당신의 것을 읽기 전에 같은 의견을 말하려고했습니다. React.createClass에 넣을지 여부가 확실하지 않습니다. 또한 반응 문서에 대한 링크를 제공해 주시겠습니까? 나는 그들의 사이트 ( facebook.github.io/react/docs/hello-world.html )를 찾지 못했습니다.
Tyler L

1
가져 오기를 포함하도록 원래 답변을 수정할 수 있습니까?
Tyler L

5
IMO, @amann은 아래에 더 나은 답변이 있습니다 . 이 답변 fetch은 React에 내장되어 있으며, 그렇지 않으며 참조 된 문서에 대한 링크가 없음을 나타냅니다. fetch(작성 시점에) 실험적인 Promise 기반 API 입니다. 브라우저 호환성을 위해 babel polyfill 이 필요 합니다 .
chris

2
이것은 React JS 문서가 아닌 React Native 문서에서 가져온 것이지만 React JS에서도 Fetch_API를 사용할 수 있습니다. 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
내장 아무것도하지 않는 반작용 때문에 나에게, 이것은 최선의 대답이다. 당신이 중 하나를 가져올 수 있습니다 fetch또는 superagent또는 jQuery또는 axios위에 배치되는 것보다 다른 아무것도하기 위해 "반작용 바닐라"의 일부가 아닌 또는 뭔가 다른 .
vapcguy

당신이 플라스크를 사용하고 있다면, 그것은 잘 작동 JSON.stringify({"key": "val"})하고 플라스크 쪽에서request.get_json()
Pro Q

예, JSON을 게시하는 경우 먼저 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

수퍼 에이전트를 설치할 수 있습니다

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 년부터 ReactJS 애플리케이션에 async / await를 통합하는보다 현대적인 옵션이 있습니다. axios와 같은 약속 기반 HTTP 클라이언트 라이브러리를 사용할 수 있습니다. 샘플 코드는 다음과 같습니다.

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가 해석합니다 awaitSyntaxError: await is a reserved word (33:19)
prayagupd

@prayagupd 어떤 버전의 노드를 사용하고 있습니까?
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

fetch ( 'url / questions', {메소드 : 'POST', 헤더 : {Accept : 'application / json', 'Content-Type': 'application / json',}, 본문 : JSON.stringify (this.state) }). then (응답 => {console.log (응답)}) .catch (error => {console.log (error)})



0

다음은 get 및 post 둘 다에 대해 수정 된 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메소드를 사용 했지만 axios, superagent 또는 fetch와 같은 AJAX 기반 라이브러리로 쉽게 바꿀 수 있습니다.


예를 들어 주셔서 감사합니다 :). 또한 서비스에서 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.