如果内容类型为'内容类型'设置为&application; / json'

时间:2016-08-17 13:53:36

标签: json reactjs cors fetch content-type

我正在研究React应用程序,我正在使用fetch来发送请求。我最近制作了一个注册表单,现在我正在将它与它的API集成。以前,API接受了url编码数据,并且一切正常。但是既然要求已经改变并且API接受了JSON中的数据,我不得不从' application / x-www-form-urlencoded'更改内容类型标题。到#application / json'。但是我收到以下错误:

  

Fetch API无法加载http://local.moberries.com/api/v1/candidate。   对预检请求的响应没有通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:3000'因此是不允许的   访问。如果不透明的响应满足您的需求,请设置请求   模式为' no-cors'在禁用CORS的情况下获取资源。

我甚至设置了“访问控制 - 允许 - 标题”'在API中,但它仍然无法正常工作。以下是客户端的相关代码:

sendFormData() {
    let {user} = this.props;

    var formData = {
      first_name: ReactDOM.findDOMNode(this.refs.firstName).value,
      last_name: ReactDOM.findDOMNode(this.refs.lastName).value,
      city: ReactDOM.findDOMNode(this.refs.currentCity).value,
      country: ReactDOM.findDOMNode(this.refs.currentCountry).value,
      is_willing_to_relocate: user.selectedOption,
      cities: relocateTo,
      professions: opportunity,
      skills: skills,
      languages: language,
      min_gross_salary: minSal,
      max_gross_salary: maxSal,
      email: ReactDOM.findDOMNode(this.refs.email).value,
      password: ReactDOM.findDOMNode(this.refs.password).value
    };

    var request = new Request('http://local.moberries.com/api/v1/candidate', {
      method: 'POST',
      mode: 'cors',
      headers: new Headers({
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      })
    });

    var requestBody = JSON.stringify(formData);

    console.log(requestBody);

    fetch(request, {body: requestBody})
      .then(
        function (response) {
          if (response.status == 200 || response.status == 201) {
            return response.json();
          } else {
            console.log('Failure!', response.status);
          }
        }).then(function (json) {

      var responseBody = json;

      console.log(typeof responseBody, responseBody);
    });

  }

以下是相关的API代码:

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers: Origin, Content-Type, application/json');
    }
}

我真的无法弄清楚问题所在。任何形式的帮助将不胜感激。

2 个答案:

答案 0 :(得分:18)

事实证明,CORS只允许某些特定的内容类型。

  

Content-Type标头唯一允许的值是:

     
      
  • 应用程序/ x-WWW窗体-urlencoded
  •   
  • 的multipart / form-data的
  •   
  • 文本/纯
  •   

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

要将内容类型设置为'application / json',我必须在API中设置自定义内容类型标头。刚删除了最后一个标题并添加了这个标题:

->header('Access-Control-Allow-Headers', 'Content-Type');

并且它运作良好。

答案 1 :(得分:0)

您违反了' Same Origin Policy'。网站www.example.com可能永远无法从任何网站www.example.net加载资源而非自身。

在开发过程中,有时需要能够做到这一点。绕过这个:

  1. 将原点移至http://local.moberries.com
  2. 或将api(您正在访问的)移动到您的localhost。
  3. 除此之外,还有一些方法可以在某些浏览器(特别是Chrome)中暂时关闭这些类型的限制,这些方法通常需要在浏览器的后续更新中付出更多努力。在Google上搜索如何在您的浏览器版本中启用跨源资源共享。
  4. 或者,如错误提示所示,引入一个标题,允许从非来源接受请求。更多信息请参见the documentation for Access Control CORS