React+axios로 Laravel API에서 JSON 가져오기

11042 단어 React라라벨axiosapi

하고 싶은 일


  • axios에서 API를 치고 JSON을 얻고 싶습니다.
  • 취득처는 마지막 기사 로 만든 녀석

  • React는 필수는 아니지만.

    환경


  • node, yarn(npm) 도입
  • 서버측은 Nginx+PHP-FPM+Laravel

  • 절차



    React+axios



    React 프로젝트 만들기


    npx create-react-app react-axios
    cd react-axios
    yarn start
    
  • create-react-app 에 의해 호스트 환경을 더럽히지 않고 npx 명령을 사용할 수 있다

  • axios 도입


    yarn add axios
    

    React 코드


  • App.js를 다음과 같이 편집
  • axios를 시도하는 것이 목적이므로 구성 요소화는 전혀 의식이 없습니다

  • src/App.js
    import React, { Component, Fragment } from 'react';
    import axios from 'axios';
    import logo from './logo.svg';
    import './App.css';
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          tasks: []
        };
        this.getData = this.getData.bind(this);
      }
    
      getData() {
        axios
          .get('http://localhost:8000/test')
          .then(results => {
            const data = results.data;
            console.log(data);
            this.setState({
              tasks: [...data]
            });
          });
      }
    
      render() {
        const tasks = this.state.tasks.map(task => {
          return <li key={task.id}>{task.title}</li>;
        });
    
        return (
          <Fragment>
            <div className="App">
              <header className="App-header">
                <img src={logo} className="App-logo" alt="logo" />
                <h1 className="App-title">Welcome to React</h1>
              </header>
              <p className="App-intro">
                To get started, edit <code>src/App.js</code> and save to reload.
              </p>
            </div>
    
            <div>
              <button onClick={this.getData}>getData</button>
              <ul>
                {tasks}
              </ul>
            </div>
          </Fragment>
        );
      }
    }
    
    export default App;
    
  • getData 버튼을 클릭하면 API에서 얻은 값을 나열합니다.

    CORS 설정


    Failed to load http://localhost:8000/test: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3001' is therefore not allowed access.
    createError.js:16 Uncaught (in promise) Error: Network Error
        at createError (createError.js:16)
        at XMLHttpRequest.handleError (xhr.js:87)
    
  • 아무것도 생각하지 않고 API를 두드려 가면 브라우저 콘솔에 이런 오류가 나온다
  • 크로스 도메인 제약이라고 한다
  • 서버 측에서 권한 설정 필요

  • Nginx로 설정하는 경우



  • 여기 참고로 설정 파일에 아래에 추가

  • /etc/nginx/conf.d/default.conf
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
    add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
    add_header Access-Control-Allow-Credentials true;
    
  • 접속 소스를 좁히지 않기 때문에 공개 API라든가 아닌 한 프로덕션 환경에서는 비추천인 설정이라고 생각한다

  • Laravel에서 설정하는 경우


  • create-react-app에서 개발하는 경우 Laravel 측에서 설정할 수있을 것 같습니다
  • 나는 하지 않았지만 여기 참조

  • 동작 확인




  • 무사 취득치를 표시할 수 있었다

  • 참고


  • React 입문 React · Redux 도입부터 서버 측 렌더링으로 UX 향상까지
  • htps : // m / rysk 92 / ms / e 5cf2 fu b8531f8 ea 3683
  • 좋은 웹페이지 즐겨찾기