คำขอดึงข้อมูลไม่ทำงานกับส่วนหัว

ฉันกำลังทำงานกับหน้าเข้าสู่ระบบด้วย ReactJs, Spring Boot และบริการเว็บที่เหลือ แอปพลิเคชันส่วนหน้า Reactjs ของฉันทำงานบนพอร์ต 8080 ในขณะที่แอปพลิเคชันบริการเว็บ/สปริงบูตของฉันทำงานบนพอร์ต 9090 ฉันกำลังพยายามใช้วิธี "ดึงข้อมูล" เพื่อเชื่อมต่อ ด้วยโค้ดแบ็กเอนด์ของฉัน แต่ฉันพบข้อผิดพลาดขณะส่งส่วนหัวในคำขอดึงข้อมูล หากฉันลบคุณสมบัติส่วนหัว การดำเนินการจะเข้าสู่วิธีแบ็กเอนด์ที่เรียกว่า ฉันต้องส่ง Headers ในวิธีการดึงข้อมูลเนื่องจากจำเป็นต้องเข้าถึงในวิธีบริการเว็บ

โปรดดูภาพรวมของคำขอและการตอบกลับของเครือข่าย ไม่มีส่วนหัว พร้อมส่วนหัว

ด้านล่างนี้คือโค้ดของไฟล์ React JSX ของฉัน:

import React, { Component } from 'react';
class App extends Component {

    constructor(props){
        super(props);
        this.state={
            email:'',
            password:''
        }
        this.handleClick = this.handleClick.bind(this);
   }

    handleClick(){

       var usernameFieldValue = this.refs.emailField.value;
       var passwordFieldValue = this.refs.passwordField.value;
       this.setState({email:usernameFieldValue})
       this.setState({password:passwordFieldValue})

       //var headers = 'Basic bmltZXNoLnBhdGVsQHRhdHZhc29mdC5jb206cGFzc3dvcmQ=';
       //alert(headers);
        fetch('http://192.168.0.239:9090/ws/login',{
            mode: 'cors',
            method: 'get',
            headers: {
                "Content-Type": "application/json",
                "Authorization": "Basic bmltZXNoLnBhdGVsQHRhdHZhc29mdC5jb206cGFzc3dvcmQ="    
            }
        }).then((response) => response.json())
        .then((responseJson) => {
           alert(" responseJson : " + responseJson);
          })
          .catch((error) => {
            alert("Error : " +error);
          });
    }    

    render() {
      return (
              <div id="loginFrame">
                  <div className="container">
                      <div id="loginHeader" className="row">
                          <div className="col-xs-12 text-center">
                              <img src="" alt="'Logo" />
                          </div>
                      </div>
                      <div id="loginBody" className="row">
                      <div className="col-xs-6 col-xs-offset-3">
                          <div className="center-block">
                              <div id="login-panel">
                                  <form id="loginForm" className="form-horizontal" role="form">
                                      <div className="form-group">
                                          <input type="text" className="form-control input-lg" id="email" name="email" ref="emailField" placeholder="Email address"/>
                                      </div>
                                      <div className="form-group">
                                          <input type="password" className="form-control input-lg" id="password" name="password" ref="passwordField" placeholder="Password"/>
                                      </div>
                                      <div className="form-group">
                                          <button onClick={this.handleClick} className="btn btn-lg btn-success pull-right">Login</button>
                                      </div>
                                  </form>
                              </div>
                          </div>
                        </div>
                      </div>
                  </div>
              </div>
      );
   }
}

export default App;

person Dhaval    schedule 25.01.2018    source แหล่งที่มา
comment
ข้อผิดพลาดคืออะไร?   -  person Umesh    schedule 25.01.2018
comment
หากฉันรวมส่วนหัวไว้ การดึงข้อมูลจะไม่ทำงาน และถ้าฉันไม่ได้ใช้ส่วนหัว มันทำให้ฉันเกิดข้อผิดพลาด: TypeError: ล้มเหลวในการดึงข้อมูลข้อผิดพลาด @อูเมช   -  person Dhaval    schedule 25.01.2018
comment
method ควรจะเป็น GET ไม่ใช่ get ฉันเดานะ   -  person Umesh    schedule 25.01.2018
comment
ฉันเปลี่ยนมันด้วย 'GET' ยังคงประสบปัญหาเดียวกัน   -  person Dhaval    schedule 25.01.2018
comment
การดึงข้อมูลต้องใช้ออบเจ็กต์ส่วนหัว เช่น var h = ส่วนหัวใหม่ () ดู MDN: developer.mozilla.org/en-US/docs /เว็บ/API/Fetch_API/Using_Fetch   -  person dannyjolie    schedule 25.01.2018
comment
ฉันได้ลอง @dannyjolie แล้ว   -  person Dhaval    schedule 25.01.2018
comment
ฉันสับสนจริงๆ .... ภาพหน้าจอที่ไม่มีส่วนหัวของคุณแสดงว่าคำขอล้มเหลว (สันนิษฐานว่าเป็นฝั่งไคลเอ็นต์เนื่องจากสถานะถูกยกเลิก) แต่ภาพหน้าจอ With headers ใช้งานได้แม้ว่าจะไม่มีส่วนหัวจริงที่คุณรวมไว้ในคำขอก็ตาม คุณช่วยอธิบายให้ชัดเจนว่าเกิดอะไรขึ้น? ป้ายกำกับภาพหน้าจอพลิกหรือไม่ ตรวจสอบคอนโซล Javascript เพื่อดูข้อผิดพลาดด้วย   -  person ccnokes    schedule 26.01.2018
comment
@Dhaval คุณช่วยตรวจสอบ api แบ็กเอนด์ของคุณทำงานได้ดีเช่นการใช้บุรุษไปรษณีย์ ฯลฯ   -  person Umesh    schedule 26.01.2018
comment
@Umesh ใช่ฉันได้ตรวจสอบกับบุรุษไปรษณีย์แล้ว ฉันได้รับการตอบสนองที่เหมาะสมในเรื่องนั้น API แบ็กเอนด์จึงทำงานได้อย่างถูกต้อง   -  person Dhaval    schedule 29.01.2018
comment
@ccnokes ป้ายกำกับภาพหน้าจอนั้นถูกต้อง ฉันได้รับข้อผิดพลาดนี้ในคอนโซลขณะใช้ส่วนหัว : Fetch API ไม่สามารถโหลด 192.168.0.239:9090/ws/login. การตอบสนองต่อคำขอ preflight ไม่ผ่านการตรวจสอบการควบคุมการเข้าถึง: ไม่มีส่วนหัว 'Access-Control-Allow-Origin' บนทรัพยากรที่ร้องขอ Origin 'localhost:8080' จึงไม่ได้รับอนุญาตให้เข้าถึง หากการตอบสนองแบบทึบตอบสนองความต้องการของคุณ ให้ตั้งค่าโหมดคำขอเป็น 'no-cors' เพื่อดึงทรัพยากรโดยปิดใช้งาน CORS   -  person Dhaval    schedule 29.01.2018
comment
ฉันลองใช้เคล็ดลับนี้แล้วและตอนนี้ฉันสามารถส่งคำขอด้วยส่วนหัวได้สำเร็จ แต่เป็นการกำหนดค่าเฉพาะของเบราว์เซอร์สำหรับการพัฒนา ฉันต้องการมันสำหรับสภาพแวดล้อมการผลิต stackoverflow.com/questions/3102819/   -  person Dhaval    schedule 29.01.2018


คำตอบ (2)


คุณไม่จำเป็นต้อง mode: cors นี่เป็นค่าเริ่มต้น

const headers = new Headers({
  "Content-Type": "application/json",
  "Authorization": "Basic bmltZXNoLnBhdGVsQHRhdHZhc29mdC5jb206cGFzc3dvcmQ="  
});

fetch('http://192.168.0.239:9090/ws/login', {
  method: 'GET',
  headers,
}).then().then().catch();
person Dan    schedule 25.01.2018
comment
มันยังใช้งานไม่ได้ ฉันได้ตรวจสอบด้วยการถอดตัวเลือก mode:cors แล้ว การดึงข้อมูลไม่ทำงานหากฉันรวมส่วนหัวไว้ในวิธีการดึงข้อมูลของฉัน @แดน - person Dhaval; 25.01.2018
comment
คุณเห็นคำขอเครือข่ายในเครื่องมือ dev ของคุณหรือไม่? มีข้อผิดพลาดของคอนโซลหรือไม่? - person Dan; 25.01.2018
comment
ฉันได้เพิ่มภาพรวมของคำขอเครือข่ายและการตอบกลับทั้งสองกรณี (มีและไม่มีส่วนหัว) - person Dhaval; 25.01.2018
comment
ด้วยส่วนหัวที่รวมอยู่ด้วย มันแสดงให้ฉันเห็นว่าตกลงด้วยรหัส 200 แต่ในความเป็นจริงแล้ว คำขอไม่ได้ถูกดำเนินการในฝั่งแบ็กเอนด์ มันจะตรวจจับโดยตรงด้วยวิธี Error ด้านล่างวิธีการดึงข้อมูล - person Dhaval; 25.01.2018
comment
ปัญหาอาจไม่เกี่ยวข้องกับการดึงข้อมูลเนื่องจากคุณส่งคำขอ HTTP GET ได้สำเร็จ แบ็กเอนด์ของคุณอาจเป็นปัญหา - person Dan; 25.01.2018
comment
ในโหมดแก้ไขข้อบกพร่อง โดยที่ส่วนหัวรวมอยู่ในการดึงข้อมูล การดำเนินการจะไม่ไปที่แบ็กเอนด์เลย ในขณะที่การดำเนินการจะไปที่แบ็กเอนด์โดยไม่มีส่วนหัว วิธีแบ็กเอนด์เดียวกันนี้ทำงานได้ดีในขณะที่ใช้ Angular js เป็นส่วนหน้า - person Dhaval; 25.01.2018

จากความคิดเห็นของคุณ ดูเหมือนว่าปัญหาพื้นฐานคือคุณกำลังดำเนินการคำขอ CORS จากแอป React ของคุณ ซึ่งให้บริการจากเซิร์ฟเวอร์ที่แตกต่างจาก Spring Backend ของคุณ ฉันไม่รู้จัก Spring แต่การเพิ่มส่วนหัว Access-Control-Allow-Origin HTTP (รวมถึงส่วนหัวที่เกี่ยวข้องกับ CORS อื่น ๆ ) จะช่วยแก้ปัญหาได้ ฉันไม่แน่ใจ 100% ว่าทำไมเมื่อคุณดึงข้อมูลโดยไม่มีส่วนหัว มันก็ใช้งานได้ อาจมีปัญหาการกำหนดค่าที่ลึกกว่านี้หรือคุณต้องกำหนดค่าเพื่ออนุญาตคำขอที่มีส่วนหัวที่คุณส่ง (Access-Control-Allow-Headers) โปรดทราบว่าหากคุณไม่ได้วางแผนที่จะอนุญาตคำขอข้ามต้นทางในการใช้งานจริง คุณอาจต้องการเพิ่มส่วนหัวเหล่านั้น ยกเว้นเมื่ออยู่ในการพัฒนา

คุณยังสามารถดึงข้อมูลได้ในโหมดไม่มี CORS (ผ่าน {mode: 'no-cors'}) แต่มีข้อ จำกัด มากมายและฉันสงสัยว่านั่นคือสิ่งที่คุณต้องการ

person ccnokes    schedule 29.01.2018