【问题标题】:Reactjs POST request through fetchReactjs POST 请求通过 fetch
【发布时间】:2018-04-25 19:27:00
【问题描述】:

您好,我正在尝试通过 fetch 进行 reactjs POST 请求,但出现两个错误,我浏览了所有文档但错误未解决。

错误:

  1. 无法加载 http://localhost:8083/students:预检响应包含无效的 HTTP 状态代码 403
  2. 未捕获(承诺中)类型错误:无法获取

这是我的 Reactjs 代码:

import React from 'react';
import RaisedButton from 'material-ui/RaisedButton';
import TextField from 'material-ui/TextField';
import axios from 'axios';
const style = {
 margin: 15,
marginLeft: 600
};
export default class  Register extends React.Component {
 constructor(props) {
   super(props);
   this.onSubmit=this.handleSubmit.bind(this);
}


handleSubmit(e) {
   e.preventDefault();
   var self = this;
   var data = new FormData();
   const payload = {
   id: 111,
   studentName: 'param',
   age: 24,
   emailId: 2
};
data.append("myjsonkey", JSON.stringify(payload));

fetch('http://localhost:8083/students',{
   method: 'POST',
   body: data,
   headers: {
    // 'Authorization': `bearer ${token}`,
    'Content-Type': 'application/json'
  }
 })
   .then(function(response) {
       return response.json()
     }).then(function(body) {
       console.log(body);
     });
 }

render() {
   return (
     <form onSubmit={this.onSubmit}>
     <div style={style}>
     <TextField ref='id'
     hintText="Enter Student id"
     floatingLabelText="id"
     />
     <br/>
     <TextField ref='sname'
     hintText="Enter your Last Name"
     floatingLabelText="StudentName"
     />
     <br/>
     <TextField ref='age'
     hintText="Enter your Age"
     floatingLabelText="age"
     />
     <br/>

     <TextField ref='emailId'
     hintText="Enter your Email"
     floatingLabelText="emailId"
     />
     <br/>
     <br/>
     <input type="submit" />


     </div>
         </form>


   );
 }


}

即使在这里我的表单值也是硬编码的。

【问题讨论】:

  • 代码 403 表示禁止,请检查您的 API 的授权
  • 我看到您的授权标头令牌已被注释掉。如果这不包括在内,您将得到 403,因为获取不会被授权

标签: javascript java reactjs rest fetch


【解决方案1】:

1-Response for preflight has invalid HTTP status code 403,表示需要在header中发送授权令牌(已注释掉)

2- Uncaught (in promise) TypeError: Failed to fetch 表示服务器未发送JSON 格式的响应,然后response.json() 抛出异常。

【讨论】:

    【解决方案2】:

    我可以看到你使用FormData,带有Content-Type 标头application/json 这是错误的。

    var data = new FormData();
    

    这里要提出的另一点是你不能像这样在FormData 中设置JSON

    data.append("myjsonkey", JSON.stringify(payload));
    

    首先你需要发送什么样的有效载荷。仅当您需要将文件发送到服务器时才使用multipart FormData。如果这样做,请确保从您的请求中删除 Content-Type 标头。

    或者,如果您想发送 JSON 数据,请创建适当的 JSON 有效负载并发送它而不是 FormData。应该可以的。

    【讨论】:

      【解决方案3】:

      错误:Response for preflight has invalid HTTP status code 403 表示您无权将数据发布到服务器。此安全策略称为 CORS (https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)。

      这里你必须有一个 API 服务器。服务器必须允许来自 localhost:8083 的请求。

      要允许此类请求,您可以在 apache 配置文件中添加标头:

      我在我的 apache 配置文件中使用以下配置:

       Header add Access-Control-Allow-Origin "http://localhost:8083"
          Header add Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method,X-Requested-By, Access-Control-Request-Headers,withCredentials"
          Header add Access-Control-Allow-Methods "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS"
         Header add Access-Control-Allow-Credentials 'true'
      

      编辑:要添加打开您的 apache 配置文件并添加以上行:

      <VirtualHost *:80>
          ......
          ......
          ......
          Header add Access-Control-Allow-Origin "http://localhost:8080"
          Header add Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method,X-Requested-By, Access-Control-Request-Headers,withCredentials"
          Header add Access-Control-Allow-Methods "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS"
         Header add Access-Control-Allow-Credentials 'true'
      </VirtualHost>
      

      配置文件的路径是:/etc/apache2/sites-available/000-default.conf,在您的情况下可能会有所不同。

      【讨论】:

      • 感谢您的回复,请告诉我如何在 apache 配置中添加标头。
      猜你喜欢
      • 2018-04-25
      • 2020-12-04
      • 1970-01-01
      • 2018-12-29
      • 2016-04-06
      • 2021-11-28
      • 2018-10-31
      • 2020-08-19
      • 2018-09-26
      相关资源
      最近更新 更多