[VB.NET] REST API⑧ Web APIでファイルをダウンロードする
テスト用のファイルを準備する
まずはダウンロードするCSVファイルを用意しましょう。
今回の例では、App_DataフォルダにCSVファイルを作成します。
「テキストファイル」を選択し、ファイル名を入力して「追加」をクリックします。
ファイル名は「Test.csv」としています。
CSVファイルの内容を作成します。
今回の例では、項目は「ID、部署番号、部署名」 としました。
CSVファイルの内容
ID,部署番号,部署名
1,A0001,総務部
2,B0002,営業部
3,C0003,開発部
4.D0004,法務部
5,E0005,経理部
6,F0006,人事部
ダウンロード用のメソッドを用意する
次に、コントローラーにファイル取得用のGETメソッドを実装しましょう。
デフォルトのコントローラーのコードは、以下のようになっています。
コード
Imports System.Net
Imports System.Web.Http
Public Class ApiTestController
Inherits ApiController
' GET api/ApiTest
Public Function GetValues() As IEnumerable(Of String)
Return New String() {"value1", "value2"}
End Function
' GET api/ApiTest/5
Public Function GetValue(ByVal id As Integer) As String
Return "value"
End Function
' POST api/ApiTest
Public Sub PostValue(<FromBody()> ByVal value As String)
End Sub
' PUT api/ApiTest/5
Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)
End Sub
' DELETE api/ApiTest/5
Public Sub DeleteValue(ByVal id As Integer)
End Sub
End Class
コードを以下のように書き換えます。
メソッド名は「GetCsvFile」としています。
「HttpGet」「ActionName(“GetCsvFile")」という属性をメソッドに付けている点に注意してください。
コード
Imports System.Net
Imports System.Web.Http
Namespace Controllers
Public Class ApiTestController
Inherits ApiController
' GET: api/ApiTest
Public Function GetValues(ByVal value As System.Net.Http.HttpRequestMessage) As IEnumerable(Of String)
Return New String() {"value1", "value2"}
End Function
' GET: api/ApiTest/5
Public Function GetValue(ByVal id As Integer) As String
Return "value"
End Function
' POST: api/ApiTest
Public Sub PostValue(<FromBody()> ByVal value As String)
End Sub
' PUT: api/ApiTest/5
Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)
End Sub
' DELETE: api/ApiTest/5
Public Sub DeleteValue(ByVal id As Integer)
End Sub
' GET: api/ApiTest/GetCsvFile
<HttpGet>
<ActionName("GetCsvFile")>
Public Function GetCsvFile(ByVal value As System.Net.Http.HttpRequestMessage) As System.Net.Http.HttpResponseMessage
'App_DataのCSVファイルのパス
Dim path As String
path = HttpContext.Current.Server.MapPath("~/App_Data/Test.csv")
'CSVファイルを読み込む
Dim bytes() As Byte
bytes = System.IO.File.ReadAllBytes(path)
'レスポンスメッセージ作成
Dim ret As System.Net.Http.HttpResponseMessage
ret = New System.Net.Http.HttpResponseMessage(HttpStatusCode.OK)
'コンテンツ
ret.Content = New System.Net.Http.ByteArrayContent(bytes)
'ファイル名
ret.Content.Headers.ContentDisposition = New Http.Headers.ContentDispositionHeaderValue("attachment")
ret.Content.Headers.ContentDisposition.FileName = "Test.csv"
'コンテンツタイプ
ret.Content.Headers.ContentType = New System.Net.Http.Headers.MediaTypeHeaderValue("text/csv")
Return ret
End Function
End Class
End Namespace
次に、「App_Start」>「WebApiConfig.vb」のコードを開きます。
コードは以下のようになっています。
コード
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http
Public Module WebApiConfig
Public Sub Register(ByVal config As HttpConfiguration)
' Web API の設定およびサービス
'jsonをブラウザで表示させる
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New System.Net.Http.Headers.MediaTypeHeaderValue("text/html"))
' Web API ルート
config.MapHttpAttributeRoutes()
config.Routes.MapHttpRoute(
name:="DefaultApi",
routeTemplate:="api/{controller}/{id}",
defaults:=New With {.id = RouteParameter.Optional}
)
End Sub
End Module
ここに、「 GetCsvFile 」メソッドをマップするためのコードを追加します。
コード
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http
Public Module WebApiConfig
Public Sub Register(ByVal config As HttpConfiguration)
' Web API の設定およびサービス
'jsonをブラウザで表示させる
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New System.Net.Http.Headers.MediaTypeHeaderValue("text/html"))
' Web API ルート
config.MapHttpAttributeRoutes()
'ファイル取得用のAPI
config.Routes.MapHttpRoute(
name:="CustomApi",
routeTemplate:="api/{controller}/{action}",
defaults:=New With {.id = RouteParameter.Optional}
)
config.Routes.MapHttpRoute(
name:="DefaultApi",
routeTemplate:="api/{controller}/{id}",
defaults:=New With {.id = RouteParameter.Optional}
)
End Sub
End Module
実行して確認する
「Test.csv」ファイルがダウンロードされました。
ダウンロードしたファイルの内容
今回はWeb APIからファイルをダウンロードしてみました。
この例ではCSVファイルですが、PDFなど他のファイル形式でもダウンロードできます。