2017年2月4日土曜日

バケット内のオブジェクト+VB.net

バケット内のオブジェクト

作成したバケットにどのようなファイルがアップロードされているかを表示してみます。APIはData Management APIの「GET buckets/:bucketKey/objects」です。

リファレンスによると、必要な情報は

  • data:readのアクセストークン
  • バケットキー

の二つです。

(1) バケットの一覧を取得し表示
(2) 表示された一覧からバケットを選択
バケットの一覧を表示し「選択」をクリック
(3)バケット内のオブジェクトの一覧を表示
バケット内のオブジェクトを表示
というシナリオで構成してみます。
ASP.net Webフォームでこのお題を解いてみます。

バケットの一覧を取得してGridViewに表示する


前回はListViewにバケットの一覧を表示しましたが、今回はGridViewに表示します。新なWebフォームを追加して、GridView(gdvBucket)とラベル(lblStatus)を追加します。FORGE APIの部分は前回と同じですが、GridViewにデータを表示するために、新たにデータセット(DataSet)を作成して、GridViewにバインドします。どうもGridViewはデータベースと結びつけないと作動しないようです。


サンプルコード


Public Class WebForm4
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


        '**********************************
        '     アクセストークンを取得
        '**********************************

        Dim acToken As String = mdlUtils.GetToken("bucket:read")
        If acToken = "" Then
            Exit Sub
        End If

        '**********************************
        '     バケットを取得
        '**********************************

        'RestSharpでクライアントを作成
        Dim url As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(url)

        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "oss/v2/buckets"

            'メソッド
            .Method = RestSharp.Method.GET

            'ヘッダー
            .AddHeader("Authorization", "Bearer " + acToken)

        End With

        '送信
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        If result.StatusCode = Net.HttpStatusCode.OK Then

            '200OKの場合


            'データセットを定義
            Dim dsBucket As New DataSet("BucketList")
            Dim tblBucket As DataTable = dsBucket.Tables.Add("Table1")
            tblBucket.Columns.Add("バケットキー", Type.GetType("System.String"))
            tblBucket.Columns.Add("作成日", Type.GetType("System.String"))
            tblBucket.Columns.Add("ポリシーキー", Type.GetType("System.String"))


            Dim responseString As String = result.Content

            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            'まず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            '"items"を取得しjArrayオブジェクトとする
            Dim itemArray As Newtonsoft.Json.Linq.JArray = jsonObj("items")
            '配列を走査し、データテーブルにデータ行を充てんする
            For Each item As Newtonsoft.Json.Linq.JObject In itemArray
                'バケットキー
                Dim strBucketKey As String = item("bucketKey")
                '作成した日付(ミリセカンド)
                Dim strCreatedDate As String = item("createdDate")
                'ポリシーキー
                Dim strPolicyKey As String = item("policyKey")

                'タイムスタンプから日付へ変換
                Dim intTimeStamp As Int64 = Int64.Parse(strCreatedDate)
                Dim dtCreateDate As DateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(intTimeStamp)


                'データセット
                Dim rowBucket As DataRow = tblBucket.NewRow()
                rowBucket("バケットキー") = strBucketKey
                rowBucket("作成日") = dtCreateDate.ToLocalTime.ToString
                rowBucket("ポリシーキー") = strPolicyKey
                tblBucket.Rows.Add(rowBucket)


            Next
            lblStatus.Text = tblBucket.Rows.Count.ToString + "個のバケットが見つかりました。"
            gdvBucket.DataSource = New DataView(tblBucket)
            gdvBucket.DataBind()

        Else
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            lblStatus.Text = "取得に失敗しました。" + vbTab + jsonObj("reason")

        End If
    End Sub
End Class

データグリッドに選択列を追加

デザインビューでデータグリッドを選択し、GridViewタスクから「列の編集」を選択します。
HyperLinkFieldを追加し、
DataNavigateUrlFields  に バケットキー
DataNavigateUrlFormatString に ~/WebForm5.aspx?BucketKey={0}
HeaderText に 詳細表示
Text に 選択

を設定します。
選択列の追加
バケットを選択したときに、次のページを呼び出すときにGridViewに表示されているデータセットテーブルの 「バケットキー」の値を受け渡します。DataNavigateUrlFormatStringには、DataNavigateUrlFieldにカンマ区切りで設定した文字列を、{0} {1}の書式で受け渡すことができます。

バケット内オブジェクト一覧

あらたなWebフォームを追加し、ラベル(lblBucketKey)とGridView(gdvObjects)を追加します。ページが遷移するときのデータの受け渡しは HttpRequestの Request.QueryStringを使います。(サンプルコードの冒頭の部分)
また、バケットの一覧を取得する部分は、バケットキーを使ってURLを作成するだけなので比較的簡単といえるでしょう。

サンプルコード

Public Class WebForm5
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


        '**********************************
        '     バケットキーを取得
        '**********************************
    
        Dim strBucketKey As String = Request.QueryString("BucketKey")
        lblBucketkey.Text = strBucketKey

        '**********************************
        '     アクセストークンを取得
        '**********************************

        'アクセストークンを取得す部分はこちらを参照してください。
        Dim acToken As String = mdlUtils.GetToken("data:read")
        If acToken = "" Then
            lblBucketkey.Text = "アクセストークンの取得に失敗しました。"
        End If

        '**********************************
        '     バケット内のオブジェクト
        '**********************************
        Dim strClient As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(strClient)

        Dim chkReq As New RestSharp.RestRequest()
        With chkReq
            .Resource = "oss/v2/buckets/" + strBucketKey + "/objects"
            .Method = RestSharp.Method.GET
            .AddParameter("Authorization", "Bearer " + acToken, RestSharp.ParameterType.HttpHeader)
            .AddParameter("Content-Type", "application/json", RestSharp.ParameterType.HttpHeader)
        End With

        Dim result As RestSharp.IRestResponse = _client.Execute(chkReq)

        '**********************************
        '     データグリッドに表示
        '**********************************
        If result.StatusCode = Net.HttpStatusCode.OK Then
            '成功した場合
            'データセットを定義
            Dim dsObjects As New DataSet("BucketList")
            Dim tblObjects As DataTable = dsObjects.Tables.Add("Table1")
            tblObjects.Columns.Add("オブジェクトキー", Type.GetType("System.String"))
            tblObjects.Columns.Add("オブジェクトID", Type.GetType("System.String"))
            tblObjects.Columns.Add("ロケーション", Type.GetType("System.String"))

            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            'まず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            '"items"を取得しjArrayオブジェクトとする
            Dim itemArray As Newtonsoft.Json.Linq.JArray = jsonObj("items")
            '配列を走査する
            For Each item As Newtonsoft.Json.Linq.JObject In itemArray
                'オブジェクトキー
                Dim strObjectKey As String = item("objectKey")
                'オブジェクトID
                Dim strObjectId As String = item("objectId")
                'ロケーション
                Dim strLoacation As String = item("location")

                'データセット
                Dim rowObjects As DataRow = tblObjects.NewRow()
                rowObjects("オブジェクトキー") = strObjectKey
                rowObjects("オブジェクトID") = strObjectId
                rowObjects("ロケーション") = strLoacation
                tblObjects.Rows.Add(rowObjects)


            Next
            gdvObjects.DataSource = New DataView(tblObjects)
            gdvObjects.DataBind()

        End If

    End Sub

End Class

GridViewを使うことで、少し見栄えも改善されました。

0 件のコメント:

コメントを投稿