none
WebServiceを使ってサーバー上のデータベースの値を更新するにはどうしたらいいでしょうか? RRS feed

  • 質問

  • サーバー上のデータベースからjsonにより値を取得することができるようになったのですが、更新をすることができません

    おそらく特定のurlを開く際に何らかの引数を与えて実施するのだと思うのですがどうすればいいのかがわかりません

    put とか post とかを使うのだと思うのですが、それぞれどのように指示をすればいいのでしょうか?

    POST api/values

    Public Sub PostValue(<FromBody()> ByVal value As String)

    PUT api/values/5

    Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)

    恐れ入りますがよろしくお願いします。

    TECH-BEE

    2014年11月9日 13:21

回答

  • 質問者さんが現われず、このスレッドはこのまま放置されそうですが、自分が関わったスレッドで中途半端に終わるのも何なので、以下の想定をベースに回答を書いておきます。

    (1) Web サービスは Visual Studio の MVC4 Web API テンプレートで作成。

    (2) クライアントは、ブラウザで、上記テンプレートで自動生成された Home/Index 経由、Web API のアクションメソッドへアクセス。

    以下のページの例を見てください。

    ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ
    http://blogs.msdn.com/b/chack/archive/2012/02/24/getting-started-with-asp.net-web-api-mvc-4-new-features.aspx

    MVC4 の Web API テンプレートでプロジェクトを作成すると、質問者さんが最初の質問に書いたようなアクションメソッドが 5 つ自動生成されますが、それぞれ以下のように CRUD (Create, Read, Update, Delete) に使用するとします。

    public IEnumerable<string> Get(): すべてのレコードを取得 (Read)
    public string Get(int id): id が一致するレコードを取得 (Read)
    public void Post([FromBody]string value): レコードを追加 (Create)
    public void Put(int id, [FromBody]string value): id が一致するレコード更新 (Update)
    public void Delete(int id): id が一致するレコードを削除 (Delete)

    その前提で、質問の「データベースの値を更新するにはどうしたらいいでしょうか?」を実現するには、Post, Put, Delete の各メソッドに、クライアントから送信されるデータ(引数に渡される)を使って、データベースを更新するコードを実装することになります。

    上に紹介した MSDN Blog の記事を例に取ると、データベースが List<Hero> 型の heroes、データベースを更新するためのビジネスロジックが List<T> クラスに用意されているプロパティ、メソッドとすると、例えば Post メソッドは以下のような感じで実装できると思います。

    // POST api/heroes
    public void Post([FromBody]Hero postedHero)
    {
        // heroes にクライアントから送られてきた postedHeroを追加
        heroes.Add(postedHero);
    }
    

    次の問題は、クライアントがどうやってデータ(上のコードで引数の postedHero)を送信するかです。(だから全体の構成を聞いたのですが・・・)

    上記 (2) で書いた構成であれば、MSDN Blog の記事の「5. jQuery による JSON データの取得と表示」を参考に、Home/Index のビューに jQuery.Ajax を利用して api/heroes にデータを POST するクライアントスクリプトを書くということになります。

    例えば、以下のようなスクリプトを書いて、ユーザーがブラウザを操作(ボタンクリックなど)してスクリプトを起動すれば、{"Id":6,"Name":"ガッチャマン"} という JSON 文字列が Web サーバーに POST され、heroes コントローラーの Post メソッドが呼び出され(HTTP POST 要求なので)、その引数に Id=6,Name="ガッチャマン" の Hero 型オブジェクトが渡されます。

    @section Scripts {
        <script type="text/javascript">
        //<![CDATA[
            function apiHeroesPost() {
                $.ajax({
                    type: "POST",
                    url: "api/heroes",
                    data: '{"Id":6,"Name":"ガッチャマン"}',
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        $('#heroes').empty();
                        $.each(data, function (key, val) {
                            var str = val.Id + ': ' + val.Name;
                            $('<li/>', { html: str }).appendTo($('#heroes'));
                        });
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        $('#heroes').empty();
                        $('#heroes').text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown);
                    }
                });
            }
        //]]>
        </script>
    }
    

    注:上で @section Scripts { ... } の中にスクリプトを記述しているのは、マスターページに @RenderSection("scripts", required: false) が含まれているという前提です。
    • 回答としてマーク Tech-Bee 2014年11月11日 14:45
    2014年11月11日 4:34

すべての返信

  • 質問する際は、一番最初に、ご自分の環境(OS, .NET, IIS, Visual Studio のバージョン、MVC ならそのバージョン、DB サーバーとそのバージョン、ブラウザを使っているなら何か)などの情報は最低書いていただけませんか?

    それから、何を作っているのか・・・Web サービスとは何なのか(.asmx?  .aspx の静的メソッド?  MVC Web API?)、をれを利用するクライアントは何なのか(Web アプリ経由でブラウザ? 直接 Windows Forms アプリ?)など、全体の構成も書いてください。

    掲示板で質問するなら、掲示板に書いてあること以外は回答者は何も知り得ないということを十分認識した上で、質問者さんの状況ややりたいことを具体的かつ明確に伝えることが必要です。

    適切に情報を提供できれば、回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られるということで、質問者さんにもメリットがあるはずです。

    それにもスキルが必要で、すぐには無理かもしれませんが、以下の記事を参考に、そのあたりを考えていただければと思います。

    技術系メーリングリストで質問するときのパターン・ランゲージ
    http://www.hyuki.com/writing/techask.html


    • 編集済み SurferOnWww 2014年11月9日 14:02 誤字訂正
    2014年11月9日 13:52
  • 失礼しました。

    私の開発環境について次の通りです。

    Windows8.1 Pro

    .net4.5

    IISはまだ立てていません

    VisualStudio2013 Ulitimate

    MVC4

    DBは今回はCSVにSQLを投げているのでとくにありません

    ブラウザは IE11 です。

    よろしくお願いします。

    2014年11月9日 14:06
  • 何を作っているのか・・・Web サービスとは何なのか(.asmx?  .aspx の静的メソッド?  MVC Web API?)、それを利用するクライアントは何なのか(Web アプリ経由でブラウザ? 直接 Windows Forms アプリ?)など、全体の構成も書いてください。
    • 編集済み SurferOnWww 2014年11月10日 3:30 誤字訂正
    2014年11月9日 14:24
  • 質問者さんが現われず、このスレッドはこのまま放置されそうですが、自分が関わったスレッドで中途半端に終わるのも何なので、以下の想定をベースに回答を書いておきます。

    (1) Web サービスは Visual Studio の MVC4 Web API テンプレートで作成。

    (2) クライアントは、ブラウザで、上記テンプレートで自動生成された Home/Index 経由、Web API のアクションメソッドへアクセス。

    以下のページの例を見てください。

    ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ
    http://blogs.msdn.com/b/chack/archive/2012/02/24/getting-started-with-asp.net-web-api-mvc-4-new-features.aspx

    MVC4 の Web API テンプレートでプロジェクトを作成すると、質問者さんが最初の質問に書いたようなアクションメソッドが 5 つ自動生成されますが、それぞれ以下のように CRUD (Create, Read, Update, Delete) に使用するとします。

    public IEnumerable<string> Get(): すべてのレコードを取得 (Read)
    public string Get(int id): id が一致するレコードを取得 (Read)
    public void Post([FromBody]string value): レコードを追加 (Create)
    public void Put(int id, [FromBody]string value): id が一致するレコード更新 (Update)
    public void Delete(int id): id が一致するレコードを削除 (Delete)

    その前提で、質問の「データベースの値を更新するにはどうしたらいいでしょうか?」を実現するには、Post, Put, Delete の各メソッドに、クライアントから送信されるデータ(引数に渡される)を使って、データベースを更新するコードを実装することになります。

    上に紹介した MSDN Blog の記事を例に取ると、データベースが List<Hero> 型の heroes、データベースを更新するためのビジネスロジックが List<T> クラスに用意されているプロパティ、メソッドとすると、例えば Post メソッドは以下のような感じで実装できると思います。

    // POST api/heroes
    public void Post([FromBody]Hero postedHero)
    {
        // heroes にクライアントから送られてきた postedHeroを追加
        heroes.Add(postedHero);
    }
    

    次の問題は、クライアントがどうやってデータ(上のコードで引数の postedHero)を送信するかです。(だから全体の構成を聞いたのですが・・・)

    上記 (2) で書いた構成であれば、MSDN Blog の記事の「5. jQuery による JSON データの取得と表示」を参考に、Home/Index のビューに jQuery.Ajax を利用して api/heroes にデータを POST するクライアントスクリプトを書くということになります。

    例えば、以下のようなスクリプトを書いて、ユーザーがブラウザを操作(ボタンクリックなど)してスクリプトを起動すれば、{"Id":6,"Name":"ガッチャマン"} という JSON 文字列が Web サーバーに POST され、heroes コントローラーの Post メソッドが呼び出され(HTTP POST 要求なので)、その引数に Id=6,Name="ガッチャマン" の Hero 型オブジェクトが渡されます。

    @section Scripts {
        <script type="text/javascript">
        //<![CDATA[
            function apiHeroesPost() {
                $.ajax({
                    type: "POST",
                    url: "api/heroes",
                    data: '{"Id":6,"Name":"ガッチャマン"}',
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        $('#heroes').empty();
                        $.each(data, function (key, val) {
                            var str = val.Id + ': ' + val.Name;
                            $('<li/>', { html: str }).appendTo($('#heroes'));
                        });
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        $('#heroes').empty();
                        $('#heroes').text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown);
                    }
                });
            }
        //]]>
        </script>
    }
    

    注:上で @section Scripts { ... } の中にスクリプトを記述しているのは、マスターページに @RenderSection("scripts", required: false) が含まれているという前提です。
    • 回答としてマーク Tech-Bee 2014年11月11日 14:45
    2014年11月11日 4:34
  • 私はWeb系の開発をほとんどしたことがなく、一般の方々にとってはごく基本的なこともわかっていないために質問自体が的外れだったかもしれませんが、こんなに丁寧に回答いただきありがとうございます。

    まだよくわからないことがいろいろとありますが提示いただいた内容をまねることにより順番に学んでいきたいと思います。

    ありがとうございました。

    2014年11月11日 14:48
  • 今回、DB の操作を行うのに (1) ASP.NET Web API を使う、(2) クライアントはブラウザでアクセスする、と言うことで、

    ブラウザ ⇒ Web アプリ ⇒ Web API ⇒ DB

    という構成で説明しましたが、(1) が必須でなければ、以下のような構成にした方が簡単かつ 1 ステップ省けて無駄がないです。

    ブラウザ ⇒ Web アプリ ⇒ DB

    承知の上での質問かもしれませんが、「私はWeb系の開発をほとんどしたことがなく」とのことですので、念のため・・・

    2014年11月12日 1:32