3

Web-API を作成しました。パラメーター BeginAddress (文字列)、EndAddress(文字列)、BegineDate (日時) を使用してすべてのルートを取得したいと考えています。これらのプロパティを使用して、新しいクラス SearchRoute を作成しました。

ID または文字列を使用して通常の Get を実行できますが、オブジェクトを指定して Get を実行するにはどうすればよいですか? これは可能ですか?

オブジェクトでポスト/プットを行い、返品を求めることは可能でしょうか?

using (HttpClient client = new HttpClient())
{
    HttpResponseMessage response = await client.GetAsync(url + userid);
    if (response.IsSuccessStatusCode)
    {
        string content = await response.Content.ReadAsStringAsync();
        List<Route> list = await SerializeService.Deserialize<List<Route>>(content);
        return list;
    }
    return null;
}

Web API 関数

public List<Route> GetAllByCity(SearchRoute sr)
{
    return RouteDAO.GetAllByCity(sr);
}

更新:これを行うと、ポストは機能しませんが、新しいコントローラーを作成すると機能します。

[HttpPost]
// POST api/route
public void Post([FromBody]Route route)
{
    RouteDAO.Create(route);
}

// POST api/route
[HttpPost]
public List<Route> Post([FromBody]SearchRoute sr)
{
    return RouteDAO.GetAllByCity(sr);
}
4

2 に答える 2

3

複雑なオブジェクトをパラメーターとして使用する場合でも、GET に固執することを好みます。URI の長さが気になる場合は、次の点に注意してください。

  1. Web API オブジェクト バインディングはプロパティ名のみに基づいて自動解決できるため、複雑なオブジェクトのように単純なプロパティ名にプレフィックスを付ける必要はありません。
  2. URLの最大許容長は 2083 文字で、ほとんどの場合十分です。

あなたの例を挙げれば

public class SearchRoute {
   public string BeginAddress {get;set;}
   public string EndAddress {get;set;}
   public DateTime BeginDate {get;set;}
}

[HttpGet]
public List<Route> Get([FromUri]SearchRoute sr)
{
    return RouteDAO.GetAllByCity(sr);
}

で検索するとウリ

  • BeginAddress = "いくつかの始まり";
  • EndAddress = "いくつかのエンディング"
  • BeginDate = "2016-01-01T16:40:00"

結果のクエリ文字列:

?BeginAddress=Some beginning&EndAddress=Some ending&BeginDate=2016-01-01T16:40:00

繰り返しになりますが、プロパティは、オブジェクトのプレフィックス/修飾子がなくても自動解決され、オブジェクト インスタンスに入力されます。

  • URL にドメイン情報を追加します。さらに 50 文字程度追加してください
  • コントローラー名を追加して、おそらくさらに 30 文字ほど追加します
  • クエリ文字列を追加 = 82 文字

スペースなどの特殊文字を Url エスケープ文字シーケンスに解決することは考慮していないことに注意してください。

合計 ≈ 162 文字 ギブまたはテイク

URL の最大許容長が 2083 文字であることを考えると、悪くはないので、この単純な例で使用できる文字数の7% しか使用していません。

GET 呼び出し/動詞はデータを変更せず、POST 呼び出し/動詞は変更するRESTful API 標準に準拠しているため、これはおそらく推奨される方法です。

于 2016-02-01T19:18:09.780 に答える
1

URI で複合型を使用してオブジェクトを渡すことができます。正しい形式のクエリ文字列を使用して、Web API を支援する必要があります。これは例です:

?SearchRoute.BeginAddress=TheAddressValue&SearchRoute.EndAddress=TheAddressValue

ただし、クエリ文字列が大きくなり始めた場合は、相互作用を正しくモデル化していない可能性があります。

次に、サーバーで、値の URI を調べる必要があることを Web API に知らせる必要があります。

public List<Route> GetAllByCity([FromUri]SearchRoute sr)
    {
        return RouteDAO.GetAllByCity(sr);
    }
于 2013-01-08T14:54:00.417 に答える