2

ASP.NET MVC 4 アプリケーションからのデータ要求を処理する ASP.NET Web API REST があります。

namespace CandidateAPI.Controllers
{
  public class CustomerDetailController : ApiController
  {

    private static readonly CustomerDetailRepository Repository = new CustomerDetailRepository();

    public IEnumerable<CustomerDetail> GetAllCustomerDetails()
    {
        return Repository.GetAll();
    }

    public CustomerDetail GetCustomerDetailById(int id)
    {
        return Repository.Get(id);
    }


    public HttpResponseMessage PostCustomerDetail(CustomerDetail item)
    {
        item = Repository.Add(item);
        var response = Request.CreateResponse<CustomerDetail>(HttpStatusCode.Created, item);

        var uri = Url.Link("DefaultApi", new { id = item.ID });
        if (uri != null) response.Headers.Location = new Uri(uri);
        return response;
    }
  }

}

ASP.NET MVC4 アプリには、前述の WEB API を呼び出すこの「ラッパー」クラスがあります。これは GET 要求を処理します

 public class CustomerDetailsService : BaseService, ICustomerDetailsService
 {
    private readonly string api = BaseUri + "/customerdetail";

    public CustomerDetail GetCustomerDetails(int id) {

        string uri = api + "/getcustomerdetailbyid?id=" + id;

        using (var httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<CustomerDetail>(response.Result).Result;
        }
    }
}

さて、私の問題は POST/PUT/DELETE REST リクエストです

 public class CustomerDetailsService : BaseService, ICustomerDetailsService
 {
    private readonly string api = BaseUri + "/customerdetail";

    // GET -- works perfect
    public CustomerDetail GetCustomerDetails(int id) {

        string uri = api + "/getcustomerdetailbyid?id=" + id;

        using (var httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<CustomerDetail>(response.Result).Result;
        }
    }

    //PUT
    public void Add(CustomerDetail detail) { //need code here };

    //POST
    public void Save(CustomerDetail detail) { //need code here };

    //DELETE
    public void Delete(int id) { //need code here};
}

私はこれを何時間もグーグルで試してみましたが、誰かが私を正しい方向に向けることができれば本当に感謝しています.

4

1 に答える 1

3

まず、ルートがそのようにマッピングされているかどうかを確認WebApiConfig.csApp_Startます (これがデフォルトです)。

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

これにより、HTTP メソッドに基づいてルーティングが行われます。したがって、/api/CustomerDetail/123 に対して GET を発行すると、アクション メソッドGetCustomerDetailById(int)が呼び出されます。/api/CustomerDetail への GET は を呼び出しますGetAllCustomerDetails()。URI でアクション メソッド名を使用することは可能ですが、必ずしも使用する必要はありません。

GET の場合、これは機能します。

Task<String> response = httpClient.GetStringAsync
        ("http://localhost:<port>/api/CustomerDetail/123");

POSTの場合、これは機能します。

HttpClient client = new HttpClient();
var task = client.PostAsJsonAsync<CustomerDetail>
             ("http://localhost:<port>/api/CustomerDetail",
                     new CustomerDetail() { // Set properties });

使用することもできます

var detail = new CustomerDetail() { // Set properties };
HttpContent content = new ObjectContent<CustomerDetail>(
                           detail, new JsonMediaTypeFormatter());
var task = client.PostAsync("api/CustomerDetail", content);

詳細については、こちらをご覧ください。

ところで、規則では、コントローラ クラス名には複数形を使用します。詳細は扱うものであるため、コントローラーの名前は CustomerDetailsController または CustomersController と名付けることができます。

また、POST はリソースの作成に、PUT はリソースの更新に一般的に使用されます。

于 2013-06-28T03:55:48.217 に答える