質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

16092閲覧

ASP.NETのWebApiへajaxでPOST送信する方法

dendenmushi

総合スコア98

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2018/02/01 10:14

編集2018/02/04 12:05

###環境
Visual Studio 2017
Xamarin.android
javascript jquery ajax edmx
ASP.NET WEBAPI
###行いたいこと
ASP.NET WEBAPIを公開したが、アドレス送信でうまくPOST送信できるが、ajaxを利用してPOST送信をしてテーブルにデータをインサートしたい。

###起きていること
ASP.NETのWEBAPIの公開で以下の実装を行いました。

C#

1 [Route("thingC/Authors/{Action}/{id}")] 2 public class AuthorsWebApiController : ApiController 3 { 4 [HttpPost] 5 public void PostAuthors(string id, string kakaku)

以下のURIを叩くとAuthorsIDが12890634に価格が100円とテーブルにインサートされます。

~azurewebsites.net/thingC/Authors/PostAuthors/12890634?kakaku=100円

しかし、以下のajaxを利用してもインサートされませんでした。

javascript

1 (function() { 2 $.ajax({ 3 url: "~azurewebsites.net/thingC/Authors/PostAuthors/12890634", 4 type: 'POST', 5 cache: false, 6 dataType: 'json', 7 data : { kakaku : "100円" }, 8 success: function () { 9 alert('投稿できました。'); 10 } 11 }); 12 })();

###他に試したこと

javascript

1 (function() { 2 var inputSt = "100円"; 3 $.ajax({ 4 url: "~azurewebsites.net/thingC/Authors/PostAuthors/12890634?kakaku=" + inputSt, 5 type: 'POST', 6 cache: false, 7 dataType: 'json', 8 success: function () { 9 alert('投稿できました。'); 10 } 11 }); 12 })();

この方法ですとうまくテーブルにインサートできましたが、POSTなのにurlにパラメーターをつけていいものか悩んでいます。なぜ上の方法ではできなく、下の方法ではできたのか疑問です。上の形式での書き方で問題あれば教えて下さい。ASP.NET WEBAPIのajaxPOST送信について以下サイトなど参考にしていますが、ずっとうまくいきません。アドバイスよろしくお願い致します。
参考サイト:javatechnology.net/ajax/post-submit/

###アドバイス後に試したこと

javascript

1 (function() { 2 var j = { kakaku: "100円"}; // j はオブジェクト 3 var jsonString = JSON.stringify(j); // jsonString は文字列 4 $.ajax({ 5 type: "POST", 6 url: "~azurewebsites.net/thingC/Authors/PostAuthors/12890634", 7 data: jsonString, 8 contentType: "application/json; charset=utf-8", 9 success: function (data) { 10 alert('ok'); 11 }, 12 error: function (jqXHR, textStatus, errorThrown) { 13 alert('NG'); 14 } 15 }); 16 })();

NGとしてアラートが出てしまいました。もしまだ何か気付いた点などあれば、よろしくお願い致します。

###2018/02/03 18:39追記
気になった点として現状の状態報告です。
[HttpPost]としてテスト用にいくつも作っています。メソッド名が違うのですが、万が一この方法だと動かないなどとあればアドバイスお願い致します。その他このネームスペースの場所ではクラスを2つ設けています。そこでもメソッド名は違いますが、同様に[HttpPost]です。念のための追加情報でした。

C#

1namespace Decode2017iq155WebApi.Controllers.thingB.Authors 2{ 3 [Route("thingB/Authors/{Action}/{id}")] 4 public class AuthorsWebApiController : ApiController 5 { 6 [HttpGet] 7 public List<AuthorsDTO> GetAllAuthors(string id) 8 { 9     ・・・ 10 } 11 12 [HttpPost] 13 public void PostAuthors(string id,[FromBody] string author) 14 { 15     ・・・ 16 17 } 18 19 [HttpPost] 20 public void InsertAuthors([FromBody]AuthorsDTO author) 21 { 22      ・・・ 23    } 24 [Route("thingB/Authors/{Action}")] 25 public class AuthorsWebApiController2 : ApiController 26 { 27 [HttpPost] 28 public List<AuthorsDTO> InsertAuthorsMain([FromBody]AuthorsDTO author)

そしてGetAllCommentsというメソッド名のWEBAPI実行であれば、
https://decode2017iq155webapi2201801************.azurewebsites.net/thingB/Authors/InsertAuthorsMain/

これがURLという認識です。GETではこのルールのURLで受け取れているのですが、POSTは404エラーが出ている状態です。

###その後 アドバイスとほぼ同じコードで試した結果

WEBAPIの公開も言われたものとほぼ同じに公開し、スクリプト側も同じにしてみました。
相違点として以下があります。
①URLは絶対パス
②AuthorIdがAuthorIDでint型
③BizBがthingD
④『using Decode2017iq155WebInterfaces.thingB.ListAuthors;』がWEBAPIのクラスのusingに私のにはある

気になった点は、web.configに以下記載追記している

<system.webServer> <modules runAllManagedModulesForAllRequests="true"/> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*"/> <add name="Access-Control-Allow-Methods" value="POST"/> <add name="Access-Control-Expose-Headers" value="x-json"/> <add name="Access-Control-Allow-Headers" value="x-prototype-version, x-requested-with"/> <add name="Access-Control-Max-Age" value="604800"/> </customHeaders> </httpProtocol> </system.webServer>

このWebApiの他のメソッドではajaxで取得していましたのでクロスドメイン制約は解決しています。

その結果、404ではなく200が無事帰ってきましたが、表は表示されませんでした。
返却は
(なぜか画像が貼れないのでコード挿入方法で)

結果画面

GetAllAuthors InsertAuhtor textStatus: error, errorThrown: @section Scripts { }

JSON
┗0
┗xc02F

ResponseHeaders
HTTP/1.1 200 Connection Established
Security
Access-Control-Allow-Origin: *
Tranceport
Connection: close

◆IIS localhost/index.htmlに接続したとき

304返却

Inspector raws

GET http://localhost/ HTTP/1.1 Host: localhost Connection: keep-alive Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8 If-None-Match: "a9c1edbba79dd31:0" If-Modified-Since: Sun, 04 Feb 2018 11:03:06 GMT

GETボタン押下後
200返却

Inspector raws

CONNECT decode2017iq155webap●●●●●●●●●.azurewebsites.net:443 HTTP/1.1 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below. Version: 3.3 (TLS/1.2) Random: 63 67 B4 86 17 3B 21 0F 30 F5 07 57 C7 07 75 18 43 61 78 A0 12 B8 9D 45 17 5D 04 26 8F 66 E6 90 "Time": 2041/08/13 10:24:51 SessionID: C9 4D 00 00 78 96 45 21 71 13 FA D6 4D 2A 18 31 2C D0 16 A2 E4 F7 A2 DD AA 04 62 79 03 E7 91 CB Extensions: 0xbaba empty renegotiation_info 00 server_name decode2017iq155webapi●●●●●●●●●●●.azurewebsites.net extended_master_secret empty SessionTicket empty signature_algs sha256_ecdsa, Unknown[0x8]_Unknown[0x4], sha256_rsa, sha384_ecdsa, Unknown[0x8]_Unknown[0x5], sha384_rsa, Unknown[0x8]_Unknown[0x6], sha512_rsa, sha1_rsa status_request OCSP - Implicit Responder SignedCertTimestamp (RFC6962) empty ALPN h2, http/1.1 ec_point_formats uncompressed [0x0] elliptic_curves unknown [0x6A6A), unknown [0x1D), secp256r1 [0x17], secp384r1 [0x18] 0x8a8a 00 padding 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Ciphers: [6A6A] Unrecognized cipher - See http://www.iana.org/assignments/tls-parameters/ [C02B] TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 [C02F] TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [C02C] TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 [C030] TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 [CCA9] TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 [CCA8] TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 [C013] TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA [C014] TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA [009C] TLS_RSA_WITH_AES_128_GCM_SHA256 [009D] TLS_RSA_WITH_AES_256_GCM_SHA384 [002F] TLS_RSA_AES_128_SHA [0035] TLS_RSA_AES_256_SHA [000A] SSL_RSA_WITH_3DES_EDE_SHA Compression: [00] NO_COMPRESSION

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/01 23:54

error に設定したコールバックの引数 textStatus, errorThrown にヒントが含まれているかもしれません。それを調べて下さい(アドバイス後のコードだけでなく、その前も)。加えて、fiddler などのキャプチャツールで要求・応答の中身を調べてみてはいかがでしょう。その前に 、デバッガでアクションメソッドの引数に何が渡されているかを調べるのを先にした方が良いと思います。
退会済みユーザー

退会済みユーザー

2018/02/02 02:59

前のスレッドの続きで https://channel9.msdn.com/Events/de-code/decode-2015/DEV-011 を参考にしてサンプルを作っていて、Microsoft のサンプルデータベース Pubs の Authors テーブルを対象としていて、今の課題は AuthorId と AuthorName を POST 送信するということでしょうか? だとすると、やり方を考え直した方がよさそうです。別途案を回答欄に追記しておきます。
dendenmushi

2018/02/02 23:18

事情鑑みて頂き本当に感謝です。試してみます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/02/06 03:04

> その後 アドバイスとほぼ同じコードで試した結果 ← それは私の回答のコードですか? であれば、表題の「ASP.NETのWebApiへajaxでPOST送信する方法」という基本線は解決できているはずです。問題があるとすると (1) やり方、(2) 質問者さんの書いたコード、(3) 質問者さん固有の環境の影響で期待した応答にならないということではないかと思いますが、それら (1) ~ (3) がどうなってるか不明ですので、当方は何も提案できる状況にないです。
退会済みユーザー

退会済みユーザー

2018/02/06 03:04

デバッガは使えませんか? 使えるのであればブレークポイントを設定してポストされた値が取得できているか見てください。取得できていれば表題の「ASP.NETのWebApiへajaxでPOST送信する方法」は解決済みということになるはずです。
退会済みユーザー

退会済みユーザー

2018/02/06 03:04

運用環境なのでデバッガがアタッチできないということであれば、ご自分の開発マシン内で試せませんか? 運用環境にデプロイする前の ASP.NET Web API アプリはご自分の開発マシンの Visual Studio で作ったのですよね? であれば容易に試せると思いますが。
dendenmushi

2018/02/07 12:56

投稿したはずがまた投稿されていない…。すいません。再投稿します。いろいろご面倒かけてしまい申し訳ありませんでした。POST送信じたいはこれで大丈夫だと思います。私固有の何か問題でして再度時間見てゼロからやり直してみます。私事で申し訳ないですがいろいろありまして今回のはいったん解決として閉じさせてください。SuferOnWwwさん、いつもありがとうございます。
guest

回答3

0

ベストアンサー

POST 要求(コンテンツとしてデータを送信)の場合、受け取る側が、

(a) application/x-www-form-urlencoded 形式を期待している場合は JavaScript オブジェクト、

(b) JSON 文字列を期待している場合はもちろん JSON 文字列

にする必要があります。詳しくは以下の記事を見てください。

jQuery.ajax の data の型
http://surferonwww.info/BlogEngine/post/2015/10/05/what-must-be-set-to-data-option-in-jquery-ajax.aspx

質問者さんのケースに当てはまるかどうか分かりませんが、自分が知る限り ASP.NET Web API では JSON 文字列を data に設定する必要がありました。

質問者さんのコードを見ると JavaScript オブジェクトが data に設定されています。それを JSON 文字列にしてみたらどうなるでしょう?

【2018/2/2 12:18 追記】

質問に対する 2018/02/02 11:59 の私のコメントで「別途案を回答欄に追記しておきます」 と書きましたが、それを以下に書きます。

https://channel9.msdn.com/Events/de-code/decode-2015/DEV-011 を参考にしてサンプルを作っていて、今の課題は AuthorId と AuthorName を POST 送信することと理解しての回答です。

AuthorId と AuthorName を含む以下のクラスが定義されているのですから、アクションメソッドの引数を AuthorDTO 型の変数にして、それに POST 送信されたデータをモデルバインドした方がよさそうです。データアノテーション検証も追加できますから。

[DataContract] public class AuthorDTO { [DataMember] public string AuthorId { get; set; } [DataMember] public string AuthorName { get; set; } }

コントローラーは以下のようにします。InsertAuthor アクションメソッドが今回の課題の POST された AuthorId と AuthorName を取得して処置するものです(INSERT 処理は省略してます。前のスレッドでやり方はアドバイス済み)。デバッガでブレークポイントを設けて変数をチェックしてください。POST された AuthorId と AuthorName が確認できるはずです。

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPI.Models; namespace WebAPI.Controllers.BizB { [Route("BizB/ListAuthors/{action}")] public class ListAuthorsWebApiController : ApiController { [HttpGet] public List<AuthorDTO> GetAllAuthors() { using (PUBSEntities pubs = new PUBSEntities()) { var query = from a in pubs.authors select new AuthorDTO { AuthorId = a.au_id, AuthorName = a.au_fname + " " + a.au_lname }; return query.ToList(); } } [HttpPost] public List<AuthorDTO> InsertAuthor([FromBody]AuthorDTO author) { string id = author.AuthorId; string name = author.AuthorName; // insert 処理・・・省略 using (PUBSEntities pubs = new PUBSEntities()) { var query = from a in pubs.authors select new AuthorDTO { AuthorId = a.au_id, AuthorName = a.au_fname + " " + a.au_lname }; return query.ToList(); } } } }

呼び出し側のクライアントスクリプトは以下のようにします。

<div> <input type="button" value="GetAllAuthors" onclick="apiGetAllAuthors();" /> <input type="button" value="InsertAuhtor" onclick="apiInsertAuthor();" /> <ul id="authors"></ul> </div> @section Scripts { <script type="text/javascript"> //<![CDATA[ function apiGetAllAuthors() { $.ajax({ type: "GET", url: "BizB/ListAuthors/GetAllAuthors", contentType: "application/json; charset=utf-8", success: function (data) { $('#authors').empty(); $.each(data, function (key, val) { var str = val.AuthorId + ': ' + val.AuthorName; $('<li/>', { html: str }).appendTo($('#authors')); }); }, error: function (jqXHR, textStatus, errorThrown) { $('#authors').empty(); $('#authors').text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); } }); } function apiInsertAuthor() { var j = { AuthorId: "123-45-6789", AuthorName: "ガッチャマンの息子" }; var jsonString = JSON.stringify(j); $.ajax({ type: "POST", url: "BizB/ListAuthors/InsertAuthor", data: jsonString, contentType: "application/json; charset=utf-8", success: function (data) { $('#authors').empty(); $.each(data, function (key, val) { var str = val.AuthorId + ': ' + val.AuthorName; $('<li/>', { html: str }).appendTo($('#authors')); }); }, error: function (jqXHR, textStatus, errorThrown) { $('#authors').empty(); $('#authors').text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); } }); } //]]> </script> }

投稿2018/02/01 10:48

編集2018/02/02 03:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2018/02/01 14:36

ありがとうございます。早速試してみます。
dendenmushi

2018/02/03 02:14

別クラスを作りROUTE設定で{id}がないものとしてInsertAuthorsメソッド作成して公開し、URLに?/AuthorID=”12890634”&AuthorName=”ガッチャマン”と叩いているのですが『The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.』になってしまっています。ちょっとこのエラーについて今調査しています。
退会済みユーザー

退会済みユーザー

2018/02/03 02:56

上の回答の提案通りにできない理由があるのですか?
退会済みユーザー

退会済みユーザー

2018/02/03 03:00

質問に対する最初の私のコメントで書いた調査はしてもらえましたか? 特に error に設定したコールバックの引数を見てください。
dendenmushi

2018/02/03 05:51

先ほどコメント送ったつもりがなぜか反映されていませんでしたのでもう一度…。fiddler使ったところ、Object object と errorが返ってきました。404でした。他のPOST送信テストで行っても上記と同じエラーになってしまい、自分のAPI公開の仕方がおかしいのかと調べていました。
退会済みユーザー

退会済みユーザー

2018/02/03 06:45

404 は Not Found で、質問者さんが指定した url ではサーバーにリソースが見つからない(たぶん url が間違っている)といってます。
退会済みユーザー

退会済みユーザー

2018/02/03 06:48

上のコメントでも聞きましたが、なぜ私の回答の通りにしないのですか? 回答を無視して違うことをするのであれば、その理由を書いてください。
退会済みユーザー

退会済みユーザー

2018/02/03 06:54

ちなみに、私が回答に書いたサンプルは期待通りの結果になることは検証済・確認済です。まずはその通りやってみてください。
dendenmushi

2018/02/03 07:14

>SuferOnWwwさん 検証確認ありがとうございます。一点同じコードにできないことはurlです。WEBAPI公開しているソリューションと別にソリューションを作っています。そのため絶対パスになります。今Fiddler使ってますが、POST送信テストの際、ComposerにURLを書いてrequestbodyにAuthorID=~とパラメーターを書いていくんですよね。その書き方がおかしいのかもしれないです。いぜん404のままです。
退会済みユーザー

退会済みユーザー

2018/02/03 07:28

404 応答が帰ってくる時点で送信するデータの内容以前の問題(アクションメソッドが見つからない = たぶん url が間違っている)があると思うのですが。
退会済みユーザー

退会済みユーザー

2018/02/03 07:42

url の何が問題なのかわかりませんが、fiddler の使い方でトラブっているなら、一度開発マシン内で送受とも完結できる ASP.NET Web API を作ってみませんか? Visual Studio のテンプレートで Web API プロジェクトを自動生成すれば簡単にできるはずです。
dendenmushi

2018/02/03 08:15

>SuperOnWwwさん SuperOnWwwさんの方法でPOST送信するときのFiddlerの使い方について聞きたいのですが、絶対パスの場合は、httpsから始まってメソッド名までになりFiddlerのInspectorに記載してからContentTypeを下の四角枠の欄に記載してからその下にrequestbodyを書くと思うのですがauthorが今回引数になっていますが、どのようにしてAuthorIDとAuthorNameを指定して送信したのでしょうか。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2018/02/03 08:17

url の問題と言うのが何かは理解できていませんが、要求に ajax を使うのは最初の話から変わってないのですよね? ひょっとしたらクロスドメインの問題があるとか? そんなことは百も承知と言うことでしたら失礼しました。
dendenmushi

2018/02/03 08:21

>SurferOnWwwさん urlが絶対パスになっているだけで問題なのかはわかっていません。WEBAPIのホストとなるURLにディレクトリとメソッド名を繋げるだけなのでURLは間違ってはいないと思うのですが…(GETの方はしっかり画面に反映されているので問題ないです。)
退会済みユーザー

退会済みユーザー

2018/02/03 08:25

上の質問者さんの疑問の答えは解答欄のサンプルコードにあります。きちんと読んでもらっているでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/03 08:29

質問者さん、分からなければ質問する前にとりあえず自分で「ajax」「クロスドメイン」等をキーワードにググるなどして調べてみてください。
dendenmushi

2018/02/03 08:42

SurferOnWwwさん 承知しました。ありがとうございます。もう一度試してみることも合わせてしてみます。
退会済みユーザー

退会済みユーザー

2018/02/03 09:23 編集

クロスドメインの話は ajax で要求を出すというのが元々のやりたいことのはずなので注意しましたが、HttpClient とか HttpWebRequest 等を使って要求を出す場合は関係ないですよ。Fiddler から直接要求を出す場合も関係ないです。
guest

0

2点、修正が必要です。

CS

1public void PostAuthors(string id, string kakaku)

CS

1public void PostAuthors(string id,[FromBody] string kakaku)

js

1data : { kakaku : "100円" },

js

1data :{ "": { kakaku : "100円" }},

投稿2018/02/03 05:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2018/02/03 05:52

こちらの方法でも試してみます。回答頂きありがとうございます。
dendenmushi

2018/02/03 06:38

なんとかWEBAPIは認識していました。ありがとうございます。ただ、登録されたのがNULLとして表に表示されてしまいました。もしかしてカンマなどで区切ったらいいのかとdata:{id:"",{ kakaku : "100円"}}など試してます。あとで追記します。
退会済みユーザー

退会済みユーザー

2018/02/03 07:03

想像ですが、質問者さんが post にこだわるのは、セキュリティの問題で、insert するデータ(id, kakaku 両方とも)を body に含めて送信したいのだと思いますが、その回答ですと id は依然としてurl に含めて送信することになっていませんか?
退会済みユーザー

退会済みユーザー

2018/02/03 07:09

趣旨はそこじゃない。 [FromBody]をつけなきゃいけないこと。dataの送信形式が ={key:balue}の形式でないと送受信できないことにあります。
退会済みユーザー

退会済みユーザー

2018/02/03 07:20

最初の趣旨はそこだと思いますけど、質問者さん、いかがですか? あと、FormBody はなくてもできる気がします。今検証できる環境がないので後で調べて結果を連絡したいと思います。
退会済みユーザー

退会済みユーザー

2018/02/03 07:24 編集

> SurferOnWwwさん つい数日前、同じところではまっていたので、その時の方法を提示しました。[FromBody]はもしかしたら、必須ではないのかもしれませんね。 INSERTの処理にIDをつける意味はないはずですけどねー でも、仕様の問題だと解釈して、そこはスルーしました。
dendenmushi

2018/02/03 07:29

お二人の方法はいずれも勉強になりますのでご教授引き続きよろしくお願いします。 Kosuke_Shibuyaさんの方法はIDをURLに含めてあとのパラメータをPOST送信する方法で、私が当初記述していた方法に近いものになりますし、別途方法が知りたいです。ただ、全てPOSTで送るのがよいと思いますのでSuferOnWwwさんの方法で実装はしていきたいます。 >Kosuke_Shibuyaさん 趣旨は[fromBody]をつけること⇒ここは言われたとおりに行てみました。 key:value形式で送信すること⇒これだとするとIDの箇所はURLに含んでいるので、””という意味なのでしょうか?例の通りに記述してはいけないということでしょうか?意味がわかりませんでした。 >SuferOnWwwさん 検証ありがとうございます。両方の方法を行ってみます。
退会済みユーザー

退会済みユーザー

2018/02/03 07:34

id が identity なら id を送信する必要はありませんが、そうではないと思います。(少なくとも参考にしている記事の Pub の Authors テーブルの AuthorId は identity ではないはずです)
退会済みユーザー

退会済みユーザー

2018/02/03 07:39

参考にするサイトが、ApiControllerでRESTを前提にしているわけじゃないから、参考サイトとしては不適当ですね〜 RESTFul APIの設定思想を最初に理解することが必要ですね。
退会済みユーザー

退会済みユーザー

2018/02/03 07:47

不適切と言うことはないと思いますよ。理由が書いてありますので読んでみてください。質問者さんはその理由を納得された上でそうしていると思いますよ。あなたは納得できないのかもしれませんが、それはまた別の話でしょう。
退会済みユーザー

退会済みユーザー

2018/02/03 08:03

それは失礼 ところで、なぜ、SurferOnWwwさんの回答のように、 error: function (jqXHR, textStatus, errorThrown) { $('#authors').empty(); $('#authors').text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); } こうしないのか? 詳細なエラーメッセージなしにデバッグは困難です。
dendenmushi

2018/02/03 08:18

>Kosuke_Shibuyaさん RESTFul APIの設定しそうについては別途勉強します。ありがとうございます。errorについては記載しました。errorとだけ返ってくる状態です。
退会済みユーザー

退会済みユーザー

2018/02/05 04:51

上の 2018/02/03 16:20 の私のコメントで書いた FromBody の要不要の件ですが、調べてみました。 (1) string などのプリミティブ型をアクションメソッドの引数にした場合、デフォルトでは url からパラメータを探してモデルバインディングする。 (2) コンプレックス型(質問者さんが参考にしているサンプルの AuthorDTO 等)の場合、デフォルトでは Formatter を使って body からパラメータを取得する(MVC のモデルバインディングとは違う)。 ・・・ということだそうです。以下の記事に詳しく書いてありました。 How WebAPI does Parameter Binding https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/ 従って、アクションメソッドの引数が string 型で body からパラメータを得たい場合は、Kosuke_Shibuya さんが書かれた通り、[FromBody] 属性は必要でした。 ただ、name にバインドするのは、Formatter というのがどういう動きをしているのか調べ切れてませんが、自分が試した限りでは以下の記事のように body に =apple というように設定しないと引数 name にはバインドされませんでした。 FromBody not binding string parameter https://stackoverflow.com/questions/11515319/frombody-not-binding-string-parameter
guest

0

サーバー側のプログラムの問題だと思います。
サーバー側はGET(URLのパラメータ)でkakakuを受け取っているので、POSTだと値が無いのでしょう。
サーバー側の仕様を見なおしてみて下さい。POSTが正しいのであればPOSTで受け取る処理に直しましょう。
GETが正しいと言われたら最後のプログラムのままで良いと思います。

投稿2018/02/01 10:34

dala00

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/01 10:52

> POSTで受け取る処理に直しましょう。 ASP.NET Web API でそれはどうやるのでしょう? 具体的に教えていただけると幸いです。
dala00

2018/02/01 11:01

失礼しました、HttpPostになっていますね。 僕のコメントは間違いのため他の方のコメントが参考になりそうです。
dendenmushi

2018/02/01 14:36

>dala00さんへ 回答頂きありがとうございました。他何か気付いた点などあればよろしくお願い致します。
dendenmushi

2018/02/03 06:31 編集

>SurferOnWwwさん コールバックの引数 はObject object と error でした。POST送信テストでfiddlerを使うにはアドレスの後ろにパラメータを追加して叩いてはいけないのでしょうか。別のPOST送信テストのサイトで行ったり、ブラウザで叩いたところ、先ほどのエラー(移動したうんぬん) が出ている状態です。fiddlerの使い方わかっていなくすいません。それも調べてます…。fiddlerでパラメーターありのときとなしのとき両方404でした。
退会済みユーザー

退会済みユーザー

2018/02/03 05:18

上のコメントは私 Surferonwww に対するものですか?
dendenmushi

2018/02/03 06:32

>SuferOnWwwさん すいません。今宛先追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問