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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2210閲覧

WebAPIのレスポンスデータが200ではなく204になることについて

syoco0330

総合スコア30

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/10/07 22:55

編集2021/10/10 01:01

開発環境:VisualStudio2019
フレームワーク:.NET 4.7.2
言語:VisualBasic
通信時のURL:https://localhost:44385/api/ApiTest

WEBAPIの開発をしております。
リクエストしたときに、VisualStudio上のIIS Expressを押した後のブラウザではJSONデータが表示されるのに対して、PostmanやVisualStudioの拡張機能のREST Cliant では204のNo Contentsが返ってきて、JSONデータが返ってきません。

通信はできているのですが、JSONデータを返さないのが分かりません。
リクエスト時のURLに問題はありませんが、お分かりになりましたがご教授頂けますと幸いです。

VisualBasic

1RouteConfig.vb 2Public Module RouteConfig 3 Public Sub RegisterRoutes(ByVal routes As RouteCollection) 4 routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 5 6 routes.MapRoute( 7 name:="Default", 8 url:="{controller}/{action}/{id}", 9 defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} 10 ) 11 End Sub 12End Module

VisualBasic

1WebApiConfig.vb 2Public Module WebApiConfig 3 Public Sub Register(ByVal config As HttpConfiguration) 4 ' Web API の設定およびサービス 5 6 'jsonをブラウザで表示させる 7 config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New System.Net.Http.Headers.MediaTypeHeaderValue("text/html")) 8 ' Web API ルート 9 config.MapHttpAttributeRoutes() 10 11 config.Routes.MapHttpRoute( 12 name:="DefaultApi", 13 routeTemplate:="api/{controller}/{id}", 14 defaults:=New With {.id = RouteParameter.Optional} 15 ) 16 End Sub 17End Module

VisualBasic

1Public Class ApiTestController 2 Inherits ApiController 3 4 ' GET: api/ApiTest 5 Public Function GetValues() As IEnumerable(Of String) 6 Return New String() {"value1", "value2"} 7 End Function 8 9 ' GET: api/ApiTest/5 10 Public Function GetValue(ByVal id As Integer) As String 11 Return "value" 12 End Function 13 14 ' POST: api/ApiTest 15 Public Sub PostValue(<FromBody()> ByVal value As String) 16 17 End Sub 18 19 ' PUT: api/ApiTest/5 20 Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String) 21 22 End Sub 23 24 ' DELETE: api/ApiTest/5 25 Public Sub DeleteValue(ByVal id As Integer) 26 27 End Sub 28 End Class
Send Request POST https://localhost:44385/api/ApiTest HTTP/1.1 content-type: application/json { "name": "sample", "time": "Wed, 21 Oct 2015 18:27:50 GMT" }

WEBAPIを作成する際に参考にしたサイト:
https://www.dcast01.com/vb-net-rest-api2/

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/07 23:39

ASP.NET のタグを付けてください。API は ASP.NET MVC / Web API ですよね。
退会済みユーザー

退会済みユーザー

2021/10/08 00:07

参考にしたサイトは URL の文字列を書くだけでなく、クリックすれば飛べるようリンクを張ってください。
退会済みユーザー

退会済みユーザー

2021/10/08 09:26

質問者さん、無言ですが、回答したのでそれに対するフィードバックを書きましょう。役に立った/立たなかったぐらいはすぐ返せるはず。役に立たなかったなら、どこがダメだったかを書くと、より質問者さんが期待する答えに近いものが出てくるかも。とにかく無言で放置は NG です
syoco0330

2021/10/10 01:02

コメントありがとうございます。 とても参考になりました。
退会済みユーザー

退会済みユーザー

2021/10/10 01:39

ASP.NET のタグを付けてください。API は ASP.NET MVC / Web API ですよね。
guest

回答2

0

自己解決

解決したため記入いたします。

Send RequestがPOSTに対して、ApiTestController のGetValues()の中が返って来ると勘違いしていたことが原因。

POSTでリクエストした場合は、

' POST: api/ApiTest Public Sub PostValue(<FromBody()> ByVal value As String)       ’ここを記入しないと200にならない End Sub

逆にGETでリクエストした場合は下のコードを通るのでReturnを記入する必要がある

Public Function GetValues() As IEnumerable(Of String) ’ここを記入しないと200にならない       Return New String() {"value1", "value2"} End Function ' GET: api/ApiTest/5 Public Function GetValue(ByVal id As Integer) As String ’ここを記入しないと200にならない Return "value" End Function

投稿2021/10/10 01:08

syoco0330

総合スコア30

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

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

退会済みユーザー

退会済みユーザー

2021/10/10 01:45

POST 要求の話だとは質問には一言も書いてないですよ。 テンプレートで自動生成されたコードでは GET 要求に対するメソッド場合しか中身がないということが認識できていなかったことと、RESTful の基本を理解していないことが問題で、そこを理解しないと解決とは言えないと思いますが、理解してますでしょうか?
guest

0

リクエストしたときに、VisualStudio上のIIS Expressを押した後のブラウザではJSONデータが表示されるのに対して、PostmanやVisualStudioの拡張機能のREST Cliant では204のNo Contentsが返ってきて、JSONデータが返ってきません。

ブラウザのアドレスバーに API の url(質問者さんのケースでは https://localhost:44385/api/ApiTest と理解)を入力して以下のように応答が返ってくるのですよね? (注:以下の画像ではブラウザに Chrome を使っています。応答が JSON ではなく XML になる理由は後述)

イメージ説明

であれば、Web API はちゃんと動いているので「PostmanやVisualStudioの拡張機能のREST Cliant」で 204 応答になるのはやり方の問題だと思います。

自分は「PostmanやVisualStudioの拡張機能のREST Cliant」は持ってないので、Windows 10 付属の curl と Fiddler の Composer を使って検証する例を紹介しておきます。

(1) Windows 10 付属の curl

上の画像の url に curl を使って GET 要求を出した場合。期待通り JSON 文字列が戻ってきています。

イメージ説明

(2) Fiddler の Composer

Fiddler というのは HTTP 要求・応答をキャプチャするツールで、その中に Composer という自由に要求を出せる機能があります。それを使って上の画像の url を GET 要求したのが下の画像です。

イメージ説明

その時の要求・応答は Inspectors ダブに切り替えて見ることができます。期待通り JSON 文字列が戻ってきています。

イメージ説明

Fiddler は今回のような Web API の開発には必要不可欠と言っても過言ではないと思います。是非入手して使えるようになることをお勧めします。

Fiddler のお勧め
http://surferonwww.info/BlogEngine/post/2011/05/25/Recommendation-of-Fiddler.aspx

最後に、何故 Chrome を使った場合の応答が JSON ではなく XML になってしまうかですが、.NET Framework 版の ASP.NET Web API を要求する際、要求ヘッダの Accept に application/xml が含まれると応答は JSON ではなく XML になるからです。

なので、ブラウザのアドレスバーに URL を入力して GET 要求をかけた場合、Chrome, Edge, Firefox では応答が JSON ではなく XML になってしまいます。IE11 は Accept に application/xml を含まないので JSON が返ってきます。

下の画像は Chrome を使った場合の要求・応答を Fiddler で見たものです。

イメージ説明

詳しくは以下の記事を読んでください。

Web API と要求ヘッダの application/xml
http://surferonwww.info/BlogEngine/post/2020/06/07/response-from-aspnet-web-api-and-application-xml.aspx

投稿2021/10/08 01:38

編集2021/10/08 07:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問