2017-07-27 12 views
0

私はSymfonyで作成したAPIにajaxリクエストを送信するReactで単純なアプリケーションを作成しています。私は、リアクションアプリとsymfony APIの両方を開発しています。 localhost:3000からlocalhost:8000に要求を送信しています。ここで私はここにsymfony APIへのajaxリクエストが返されません。 'Access-Control-Allow-Origin'ヘッダがありません。

addUser (data) { 
    console.log('made it') 
    let request = { 
     method: 'post', 
     url: 'http://127.0.0.1:8000/user/post', 
     data: JSON.stringify({'username': data}), 
     contentType: 'application/json' 
    } 
    $.ajax(request) 
     .done(data => this.addUserSuccess(data)) 
     .fail(err => this.addUserFail(err)) 
    } 

を送信していますAjaxのリクエストは

/** 
    * Creates a new user entity. 
    * 
    * @Route("/post", name="user_new") 
    * @Method({"GET", "POST"}) 
    */ 
    function newAction(Request $request) { 
     echo $request; 
     $body = $request->getContent(); 
     $body = json_decode($body,true); 
     $username = $body['username']; 
     $user = new User($username); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($user); 
     $em->flush(); 

     return new JsonResponse($user,200,array('Access-Control-Allow-Origin'=> '*')); 
    } 

私が最初にこれまでだとあなたが見ることができるように私が作成しています要求の世話をするSymmfonyアプリがされていますパスワードやセキュリティなどのない新しいユーザー。私はちょうどそれを動作させ、アプリからapiにリクエストを送ることができるようにしたい。結果は次のとおりです

XMLHttpRequestはhttp://127.0.0.1:8000/user/postをロードできません。プリフライト要求への応答がアクセス制御チェックを通過しない:要求されたリソースに「アクセス制御許可」がない。 Origin 'http://localhost:3000'はアクセスできません。応答は、HTTPステータスコード405

を持っていた私は前にこのような多くの質問を見ていると回答の一つは、ヘッダと、あなたはそれが動作しません見ることができるようにJsonResponseを返すようにしました。

ここに私が従った答え - Origin is not allowed by Access-Control-Allow-Originがありますが、残念なことに成功しませんでした。

修正方法を教えてもらえますか?前もって感謝します!

+0

私はあなたの質問のいくつかを見て、(HTTPS [あなた自身の答えを含む]受け入れることが適切であるかもしれない答え、といくつかに気づきました:/ /stackoverflow.blog/2009/01/06/accept-your-own-answers/)。これはあなたの問題が解決された場合、[回答を受け入れる](https://stackoverflow.com/help/someone-answers)へのフレンドリーな思い出です。 – aplum

答えて

1

同じ状況で私がやっていることは次のとおりです。 app/config/config_dev.ymlに新しいサービスを追加します。これをconfig_dev.ymlに入れると、これは、app_dev.phpまでのリクエストにのみ影響します。

services: 
    app.cors_listener: 
     class: AppBundle\Security\CorsListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

そしてAppBundle/Security/CorsListener.phpの内容:

<?php 
namespace AppBundle\Security; 

use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 

// Based on http://stackoverflow.com/a/21720357 
class CorsListener 
{ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $responseHeaders = $event->getResponse()->headers; 

     $responseHeaders->set('Access-Control-Allow-Headers', 'origin, content-type, accept, credentials'); 
     $responseHeaders->set('Access-Control-Allow-Origin', 'http://localhost:8080'); 
     $responseHeaders->set('Access-Control-Allow-Credentials', 'true'); 
     $responseHeaders->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS'); 
    } 
} 
+0

ありがとう、これは働いた!私は自分の関数でOPTIONSを許可されたメソッドとして追加しなければならないということを付け加えなければなりません。何らかの理由でSymfony APIがリクエストを受け付けていますが、内部サーバエラーがあります。どのように私はAPIをデバッグできますか教えていただけますか?意味はどうやってコンソールに情報を入れ、実際に何が起こるかを見ることができますか?コンソール上で動作するdump()のようなもの –

+0

私はsymfonyを自分で学習しています。それを使ってからしばらく経っていますので、他の人がもっと助けてくれるかもしれません。しかし、開始するには、[この回答](https:// stackoverflow。com/a/2687747)とサーバーのエラーログを使用して、内部サーバーのエラーを解決します。 – aplum

1

yout PHPファイルに正しいヘッダーを設定する必要があります。

header('Access-Control-Allow-Origin: *'); 
+0

もっとコンテキストを与えるだけですhttps://stackoverflow.com/questions/ 10143093/origin-is-by-allow-by-access-control-allow-origin- – Devesh

+0

どのPHPファイルですか?関数の先頭にコードを追加しても、それはまだ機能しません。私はSymfonyを使用していますが、ファイルがたくさんあり、どこに置くべきか分かりません。 AppKernelでは? app.php?私はそれが応答になければならないと思ったので、これはJsonResponseの最後のパラメータとしてヘッダー付きの配列を送ります。この場合、ヘッダは '*'の値を持つ 'Access-Control-Allow-Origin'です。まだ何も –

関連する問題