141

.Net MVC4 Web APIを使用して(うまくいけば)RESTfulAPIを実装しています。いくつかのパラメーターをシステムに渡して、システムに何らかのアクションを実行させてから、結果としてオブジェクトのリストを返す必要があります。具体的には、2つの日付を渡し、それらの間にあるレコードを返します。また、後続の呼び出しがシステムで再処理されないように、返されたレコードを追跡しています。

私はいくつかのアプローチを検討しました:

  1. パラメータを1つのJSON文字列にシリアル化し、APIで分離します。 http://forums.asp.net/t/1807316.aspx/1

  2. クエリ文字列でパラメータを渡します。
    複数のクエリパラメータをRESTfulAPIに渡すための最良の方法は何ですか?

  3. ルート内のパラメーターの定義:api / controller / date1 / date2

  4. 本質的にパラメータを使用してオブジェクトを渡すことができるPOSTを使用します。

  5. Web API(現在)がODATAをサポートしているので、ODATAを調査しています。私はまだこれをあまり使っていないので、あまり詳しくありません。

適切なRESTプラクティスは、データがプルされるタイミングを示しているようです。GETを使用する必要があります。ただし、GETも無効である必要があり(副作用は発生しません)、APIシステムでレコードをマークしているため、特定の実装が違反しているのではないかと思います。したがって、副作用が発生しています。

また、変数パラメーターをサポートするという質問にもつながりました。入力パラメータリストが変更された場合、それが頻繁に発生する場合は、選択肢3のルートを再定義する必要があるのは面倒です。そして、パラメータが実行時に定義された場合はどうなるでしょうか...

いずれにせよ、私の特定の実装では、(もしあれば)どの選択が最良と思われますか?

4

12 に答える 12

49

WebApiConfigエントリに新しいルートを追加するだけです。

たとえば、次のように呼び出します。

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..

追加:

config.Routes.MapHttpRoute(
    name: "GetPagedData",
    routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);

次に、パラメーターを HTTP 呼び出しに追加します。

GET //<service address>/Api/Data/2/10 
于 2013-05-14T22:19:00.007 に答える
45

パラメータを渡す必要があるRESTfull APIを実装する必要がありました。マークの最初の例「api/controller?start=date1&end=date2」で説明されているのと同じスタイルで、クエリ文字列にパラメーターを渡すことでこれを行いました

コントローラーで、C# の URL 分割からのヒントを使用しましたか?

// uri: /api/courses
public IEnumerable<Course> Get()
{
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
    var system = nvc["System"];
    // BL comes here
    return _courses;
}

私の場合、次のように Ajax 経由で WebApi を呼び出していました。

$.ajax({
        url: '/api/DbMetaData',
        type: 'GET',
        data: { system : 'My System',
                searchString: '123' },
        dataType: 'json',
        success: function (data) {
                  $.each(data, function (index, v) {
                  alert(index + ': ' + v.name);
                  });
         },
         statusCode: {
                  404: function () {
                       alert('Failed');
                       }
        }
   });

これが役立つことを願っています...

于 2012-09-26T08:04:18.397 に答える
39

http://habrahabr.ru/post/164945/で優れたソリューションを見つけました

public class ResourceQuery
{
   public string Param1 { get; set; }
   public int OptionalParam2 { get; set; }
}

public class SampleResourceController : ApiController
{
    public SampleResourceModel Get([FromUri] ResourceQuery query)
    {
        // action
    }
}
于 2013-08-22T09:56:03.417 に答える
10

この記録マークは何を意味するのでしょうか? これがロギング目的でのみ使用される場合は、このリソースのすべてのクエリをログに記録する必要があるため、GET を使用してすべてのキャッシュを無効にします。レコード マーキングに別の目的がある場合は、POST が適しています。ユーザーは、自分の行動がシステムに影響を与え、POST メソッドが警告であることを知っておく必要があります。

于 2012-06-07T19:15:06.307 に答える
9

GETまたはPOSTの使用は、 @LukLedによって明確に説明されています。パラメータを渡す方法については、2 番目の方法をお勧めします ( ODATAについてもよくわかりません)。

1. params を 1 つの JSON 文字列にシリアル化し、API でそれを分離します。http://forums.asp.net/t/1807316.aspx/1

これはユーザーフレンドリーでもSEOフレンドリーでもありません

2.クエリ文字列でパラメーターを渡します。複数のクエリパラメータを安静なAPIに渡す最良の方法は何ですか?

これは、通常の望ましいアプローチです。

3. ルートのパラメーターを定義する: api/controller/date1/date2

これは間違いなく良いアプローチではありません。これは、誰かdate2がのサブリソースであるdate1と感じさせますが、そうではありません。date1とは両方ともdate2クエリ パラメータであり、同じレベルにあります。

単純なケースでは、次のような URI を提案します。

api/controller?start=date1&end=date2

個人的には以下の URI パターンが気に入っていますが、この場合はカスタム コードを記述してパラメーターをマッピングする必要があります。

api/controller/date1,date2
于 2012-06-08T10:53:41.647 に答える
8

ここで完全に説明されているようにパラメーターバインディングを使用してください:http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

于 2013-10-19T03:36:19.347 に答える
4
 [Route("api/controller/{one}/{two}")]
    public string Get(int One, int Two)
    {
        return "both params of the root link({one},{two}) and Get function parameters (one, two)  should be same ";
    }

ルート リンク ({one},{two}) と Get 関数パラメーター (one, two) の両方のパラメーターは同じである必要があります

于 2018-08-23T13:20:15.010 に答える
0
    public HttpResponseMessage Get(int id,string numb)
    {
        //this will differ according to your entity name
        using (MarketEntities entities = new MarketEntities())
        {
          var ent=  entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
            if (ent != null)
            {
                return Request.CreateResponse(HttpStatusCode.OK, ent);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
            }
        }
    }
于 2019-02-15T07:45:23.870 に答える