2016-08-29 10 views
-2

Angular2で投稿リクエストを作成しようとしています。何らかの理由で私はPOST要求をしません。私はクライアントとサーバーの両方をGETリクエストに変更し、それ以外は同じものを残しました。正常に動作します。だから私はPOSTの要求を行うことができるようにヘッダを別の方法を構成することができますかと思います。
更新
は、だから私はそれを実行するために得ることができたが、今場所のパラメータはnull見せているHTTP POSTはASP.NETには実行されませんが、GETリクエストは

クライアント

search(latitude: any, longitude: any){ 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 
     let body = JSON.stringify({ latitude, longitude }); 
     this.http.post('/api/SampleData/CurrentForecasts',body, { headers: headers }) 
     .map(response => response.json()) 
     .subscribe(
      data => this.Debug(data), 
      err => console.log("Error: \n"+err), 
      () => console.log('Get Complete') 
     ); 
} 

サーバー

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Mvc; 
using System.Net.Http; 
using System.Net.Http.Headers; 

namespace Weather.Controllers 
{ 
    [Route("api/[controller]")] 
    public class SampleDataController : Controller 
    { 
     private static string[] Summaries = new[] 
     { 
      "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" 
     }; 
     [HttpPost("[action]")] 
     public async Task<IActionResult> CurrentForecasts(string location) 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri(" https://api.forecast.io/"); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

       // HTTP GET 
       HttpResponseMessage response = await client.GetAsync("forecast/APIKEY/"+location); 
       if (response.IsSuccessStatusCode) 
       { 
        var forecast = await response.Content.ReadAsStringAsync(); 
        return Content(forecast, "application/json"); 
       } 
      } 
      return Json(null); 
     } 
     [HttpGet("[action]")] 
     public async Task<IActionResult> SendRequest() 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri(" https://api.forecast.io/"); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

       // HTTP GET 
       HttpResponseMessage response = await client.GetAsync("forecast/APIKEY/37.8267,-122.423"); 
       if (response.IsSuccessStatusCode) 
       { 
        var forecast = await response.Content.ReadAsStringAsync(); 
        return Content(forecast, "application/json"); 
       } 
      } 
      return Json(null); 
     } 
    } 
} 

エラー 場所[ヌル]

+0

サーバー側のルーティング設定はどのようになっていますか? –

+0

[Route( "api/[controller]")] – John

+0

POSTパラメータを除いて、同じコードのGET要求が機能します。だから私はそれを疑う。 – John

答えて

1
import {Http, Response, Headers, RequestOptions, URLSearchParams} from 'angular2/http'; 


let headers = new Headers({ 'Content-Type': 'application/json' }); 
let options = new RequestOptions({ 
    headers: headers,   
    search: new URLSearchParams('location='+body) 
}); 
this.http.post('/api/SampleData/CurrentForecasts', null, options) 

編集: あなたのサーバーにclassを作成するために、良いアイデアのようになります。

public class Location 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
} 

そしてへのあなたの方法のsignitureを変更:

public async Task<IActionResult> CurrentForecasts(Location location) 

へAngular2の投稿データ:

let location = { Latitude: latitude, Longitude: longitude } 
let headers = new Headers({ 'Content-Type': 'application/json' }); 
let body = JSON.stringify(location); 
this.http.post('/api/SampleData/CurrentForecasts', body, headers) 
+0

RequestOptionsとURLSearchParamsをインポートするにはどうすればよいですか? – John

+0

が編集されました。もう一度答えを参照してください –

+0

これはうんうん。本当にありがとう!!!! – John

0

注:以下のコードは、AngularJSのソリューションです。 Angular2についてはthisをご覧ください。

var param = {location: body} 
var configObj = { headers: headers, params: param }; 
this.http.post('/api/SampleData/CurrentForecasts', null, configObj) 
+0

[ts]引数 '{ヘッダ​​:ヘッダ; params:{場所:文字列; }; } 'は' RequestOptionsArgs 'タイプのパラメータに割り当てられません。オブジェクトリテラルは既知のプロパティのみを指定し、 'params'は 'RequestOptionsArgs'型に存在しません。 – John

+0

今すぐに作業する必要があります –

+0

ええ、場所はnullです。 ロケーション null [string] – John

0

HttpGetは投稿リクエストを処理しないでください。必要なのは、Web APIコントローラーにRouteAttributeを定義することです。

[HttpPost] 
[Route("api/SampleData")] 
public async Task<IActionResult> CurrentForecasts(string location) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(" https://api.forecast.io/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     // HTTP GET 
     HttpResponseMessage response = await client.GetAsync("forecast/APIKEY/"+location); 
     if (response.IsSuccessStatusCode) 
     { 
      var forecast = await response.Content.ReadAsStringAsync(); 
      return Content(forecast, "application/json"); 
     } 
    } 
    return Json("Failed"); 

はまた、あなたのクライアント側であなただけ言うことができる:

let headers = new Headers(); 
    headers.append('Content-Type', 'application/json') 
    let body = latitude+','+longitude ; 

    this.http.post('/api/SampleData/',body, { headers: headers }) 
    .map(response => response.json()) 
    .subscribe(
     data => this.Debug(data), 
     err => console.log("Error: \n"+err), 
     () => console.log('Get Complete') 
    ); 

Json(null)Json("Failed")のようなものを戻ると、上記のエラーが発生することがあります。たぶん、あなたの応答をいくつかのオブジェクトに入れようとすると、おそらく何かdataプロパティを読み込もうとする前に、あなたの側で最初にそれを照会することができるように、いくつかのSuccessプロパティがブール値です。

public class ResponseModel 
{ 
    public IList<SomeModel> Data {get; set;} 
    public bool Success { get; set; } 
    public string ErrorMessage { get; set; } 
} 

などのモデルやビューモデルを作成し、上記のモデルの周りにあなたの回答を作成してください。上記のモデルをちょっと詳しく説明したいと思うかもしれません。

+0

私はすでにRouteAttributeを持っています。何が起こっているのか分かるまで、ヌルはフィラーだけでした。 – John

0

.Netのデフォルトルーティングでは、似たような(慣例によるコーディング)メソッド名へのマップアクションが行われています。デフォルトのGETアクションは、直接何も一致しない場合に利用可能な最初のメソッドを見つけます。

あなたのコントローラが "SampleDataを" と命名されているので、あなたが...

A)など "GetSampleData"、 "PostSampleData" として同様の方法で、あなたの方法を、名前を変更する必要がありますどちらか

ルータは、フォームフィールドが一致し、あなたが設定されるべきであるように、ちょうどあなたの体を更新し、このような

[HttpPost] 
[ActionName("CurrentForecasts")] 
public async Task<IActionResult> CurrentForecasts(string location) 
{ 
    ...your code here 
} 

として物事をマッピングする方法を知っているように、B)HttpPostと行動のためのデータの注釈を追加します。

+0

'Action'は属性クラスではありません[netcoreapp1.0] Action.Action(object @object、IntPtrメソッド) – John

+0

謝罪は、 "ActionName"と読み替えてください。 –

+0

これは私にこのエラーを与えます エラー: JSON.parse:JSONデータの1行目の予期しない文字 – John

関連する問題