2016-11-30 5 views
0

私はAngular + typescriptで動作しているクライアントを持っており、フロントエンドWeb開発には全く新しいものです。私の予期せぬことにエラーコールバックに行くのはなぜですか?

(私が開発した)php APIに投稿リクエストを送る必要があります。要求はサーバーに正しく到着し、サーバーは応答本体を正しいデータで埋めます(サーバーをデバッグして確認した)。

問題は、サーバが応答すると、角度約束エラーコールバックを実行し、応答データが空である、ということです。ブラウザで送信されたリクエストをチェックすると、200 OKステータスで応答されたが、空のボディがあると表示されます。

私は、FirefoxのApi-requesterアドオンを使用して同じparamentresで同じAPIエンドポイントを呼び出そうとしましたが、正しいボディでレスポンスを受信しました...なぜ、私のAngularクライアントは成功しませんでしたか?

次のコードは、私のコントローラに対応:

 vm.query = { 
      'tx_filtre':'', 'idioma_filtre':'', 'tipus':'', 'id_dimfisica':'', 'tamPag':15, 'numPag':0 
     }; 

     this.PropietatsService.getPropietats(vm.query) 
      .then((response: ng.IHttpPromiseCallbackArg<string>) => { 
       vm.objResult = JSON.parse(response.data); 
       vm.propietats = vm.objResult.info; 
       console.log('rebut', this.propietats); 
      }, (response: ng.IHttpPromiseCallbackArg<string>) => { 
       //always executes this error function, why???? 
       vm.objResult = JSON.parse(response.data); 
      }); 

そして、これは、サービスに関連するコードです:

getPropietats(query: any): ng.IPromise<ng.IHttpPromiseCallbackArg<string>> { 
     var config = { 
      headers : { 
       'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;' 
      } 
     }; 
     return this.$http.post("http://localhost:8080/diccionaris/propietat/get",JSON.stringify(query),config); 
    } 

PS:また、サイドノートに、何らかの理由で私のサーバー用私のクライアントで 'Content-Type'というリクエストを 'application/json'に設定した場合、リクエストを処理できません。それが私が 'application/x-www-form-urlencoded'に設定した理由です。

P.P.S:私はあなたがPOSTリクエストで呼び出さget関数を参照してくださいが、私は唯一の私の上司の命令を次れたとき、それは痛い知っている...高度で

ありがとう!

+0

あなたは200を得ていますか? [docs](https://docs.angularjs.org/api/ng/service/$http)によると、ステータスコードが200-299の場合は成功コールバックが呼び出されます。 –

+0

はい、Chrome DevToolsでチェックしました。 [ネットワーク]タブをクリックします。 – Driond

答えて

0

'Content-Type': 'application/x-www-form-urlencoded; charset = utf-8;'を設定しますが、クエリパラメータをJSONにエンコードし、JSONなどのレスポンスをデコードしようとします。 application/jsonを設定するか、JSON.encodeリクエストパラメータを削除して、queryというメソッドに送信してみてください。 それはエラーコールバックで(responseで)エラーを記録し、サーバーがapplication/jsonを受け入れることができない場合には、それに

0

を見て問題が解決しない場合は、POSTデータがapplication/x-www-form-urlencoded用にエンコードする必要があります。この使用$httpParamSerializer Serviceを行うには:

getPropietats(query: any): ng.IPromise<ng.IHttpPromiseCallbackArg<string>> { 
    var config = { 
     headers : { 
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;' 
     }, 
     transformRequest: $httpParamSerializer 
    }; 
    return this.$http.post(url,query,config); 
} 
0

は、私は最終的に解決策を見つけた:それはCORS問題ました。

サーバーとクライアントを2つの異なるローカルホストポートで実行していたため、サーバーが要求を処理しましたが(これはあまり意味がありませんが)、クライアントが許可されていないため応答を返さなかったサーバーにアクセスします。

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

をそして今、それだけで正常に動作します:今のところそれに対処するために、私は私のサーバーのindex.phpに次の行を追加しました。

関連する問題