ラベル access token の投稿を表示しています。 すべての投稿を表示
ラベル access token の投稿を表示しています。 すべての投稿を表示

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を使うことで、少し見栄えも改善されました。

2017年2月1日水曜日

ファイルのアップロード +VB.net

バケットにファイルをアップロードする


作成したバケットにファイルをアップロードします。必要な情報は

  • アクセストークン data:create または  data:write (既存のファイルは上書き)
  • バケットキー   ファイルをアップロードするバケット

です。ここでもRestSharpを使ってファイルをアップロードしてみます。ユーザーインターフェイスは前回のバケット一覧を少し改造して、下の図のようにしてみました。
WebForm3.aspx
[参照]ボタンを押して選択したファイルを、lbxBucketsで選択したバケットに[アップロード]ボタンでアップロードし、そのObjectIDを取得して表示する、というシナリオです。

サンプルコード


アップロードボタンのクリックイベントのハンドラを示します。

    Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click

        '**********************************
        ' アップロードするファイルを取得
        '**********************************

        'ファイルが選択されているか?
        If FileUpload1.HasFile = False Then
            MsgBox("ファイルが選択されていません。", MsgBoxStyle.OkOnly)
            Exit Sub
        End If

        'バケットにアップロードするファイル
        'FileUploadで転送されたファイル
        Dim fileToUpload As HttpPostedFile = FileUpload1.PostedFile

        'ファイル名(インターネットエクスプローラはフルパスを返す)
        Dim strFullPath As String = fileToUpload.FileName

        'ファイル名だけ取り出す
        Dim strFileName As String = IO.Path.GetFileName(strFullPath)

        '①ファイル名をURLエンコードする
        Dim strObjectKey As String = System.Web.HttpUtility.UrlEncode(strFileName)

        'ファイルの内容を読んでByteの配列とする
        Dim fileData As Byte() = Nothing
        Using binaryReader As New IO.BinaryReader(fileToUpload.InputStream)
            fileData = binaryReader.ReadBytes(fileToUpload.ContentLength)
        End Using


        '現在選択しているバケットキーを取得
        Dim strBucketKey As String = lbxBuckets.SelectedValue

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

        Dim acToken As String = mdlUtils.GetToken("data:write")
        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/" + strBucketKey + "/objects/" + strObjectKey

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

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

            'BODY
            .AddParameter("Content-Type", fileToUpload.ContentType)
            .AddParameter("Content-Length", fileToUpload.ContentLength)

            '②アップロードするファイルをリクエストボディに追加
            .AddParameter("requestBody", fileData, RestSharp.ParameterType.RequestBody)

        End With

        'リクエスト送信
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        '結果
        If result.StatusCode = Net.HttpStatusCode.OK Then

            'ObjectIdを取得する
            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            'objectId
            lblObjectId.Text = jsonObj("objectId")

        Else
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            lblObjectId.Text = jsonObj("reason")

        End If

    End Sub

ポイントは①のファイルの名前をエンコードすることを忘れないようにするところと、②のファイルをBODYにテンプルすところです。

大きなサイズのデータを送れるようにする


ASP.netのFileUploadコントロールは転送できるファイルサイズが4MB程度に制限されているので、これを300MB(300×1024=307200KB)に緩和します。

ソリューションエクスプローラで「Web.config」ファイルを開き、17行目あたりにある
<httpRuntime targetFramework="4.6"/>
の末尾の/の前をクリックし、maxRequestLength="307200"と追記します。4.6"の後ろにスペースを空けて、maxと打てばインテリセンスが働いて、maxRequestを探すことができます。

  <system.web>
    <authentication mode="None" />
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" maxRequestLength="307200" />
    <pages>
      <namespaces>
     ・・・・

実行する


デバッグ起動してバケットと、アップロードするファイルを選択して「アップロード」ボタンを押すと、ファイルサイズによっては時間がかかりますが、うまくいけばオブジェクトIDが返ってきます。


2017年1月24日火曜日

バケットの一覧 +VB.net

現在のバケットの一覧を取得

バケットの一覧を取得するにはDataManagementAPIのGET Bucketを使います。前回のプロジェクトを利用して、WebFormでバケットの一覧を取得してみます。

WebFormの追加

WebFormを追加して、下の図のようにサーバーコントロールを配置します。
サンプルのWebForm

サンプルコード


以下はバケットの一覧を取得するサンプルコードです。ポイントは「apiの戻り値のJSONの配列を処理する部分です。レスポンスをNewtonsoft.Json.Linq.JArray型に変換して情報を取り出します。

Public Class WebForm3
    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

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

        If result.StatusCode = Net.HttpStatusCode.OK Then

            '200OKの場合

            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)

                'リストボックスのアイテムを追加する
                lbxBuckets.Items.Add(New ListItem(strBucketKey + " / 作成日時 : " + dtCreateDate.ToLocalTime.ToString + " / ポリシーキー : " + strPolicyKey, strBucketKey))

            Next
            lblStatus.Text = itemArray.Count.ToString + "個のバケットが見つかりました。"
        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

実行する

実行すると以下のようになります。
現在のバケットの一覧

2017年1月19日木曜日

バケット作成 + VB.net

バケットを作成する

バケットを作成するにはまずbucket:createスコープでアクセストークンを取得し、ポリシーキー(データの保持期間)とバケット名(bucketId)を決めてPOSTで取得するという手順でした。これをvb.netで実装してみます。

アクセストークン取得モジュール

アクセストークンは様々な場面で必要なので、モジュールで関数にしておきます。

プロジェクトにモジュールを追加して「mdlUtils.vb」とします。以下はコードサンプルです。

Imports System.Net


Module mdlUtils

    Public Const CLIENTID As String = "自分のクライアントID"
    Public Const CLIENTSECRET As String = "自分のクライアントシークレット"
    Private ENDPOINT As String = "https://developer.api.autodesk.com"-

    ''' <summary>
    ''' 目的に応じたアクセストークンを取得する
    ''' </summary>
    ''' <param name="scopeString">スコープ</param>
    ''' <returns></returns>
    Public Function GetToken(ByVal scopeString As String) As String

        'RestSharpでクライアントを作成
        Dim _client As New RestSharp.RestClient(ENDPOINT)
        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "authentication/v1/authenticate"

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

            'ヘッダー
            .AddHeader("Content-Type", "application/x-www-form-urlencoded")

            'ボディ
            .AddParameter("client_id", CLIENTID)
            .AddParameter("client_secret", CLIENTSECRET)
            .AddParameter("grant_type", "client_credentials")

            'スコープ
            .AddParameter("scope", scopeString)
        End With

        'POSTする
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        If result.StatusCode = HttpStatusCode.OK Then

            '結果(json形式の結果が文字列で返ってくる)
            'このjsonは以下の形式となる
            '{
            '  "token_type": "Bearer",
            '  "expires_in": 1799,
            '  "access_token": "Ff387cyQXw1elOT3nldiFIKBqDOs"
            '}
            Dim responseString As String = result.Content
            'ここからaccess_tokenの値だけを取り出す

            '文字列を操作しても可能だが、Newtonsont.JsonのJSON解読メソッドを使うと便利です。
            '使い方はまず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)

            'アクセストークンをオブジェクトに引数を与えて取得します
            Dim acToken As String = jsonObj("access_token")

            'Label1の表示を変更
            Return acToken

        Else
            '失敗した場合
            Return ""
        End If
    End Function
End Module

WebFormの追加


WebFormを一つ追加して、下の図のようにリストボックスとテキストボックス、ラベルを追加します。
WebFormにコントロールを追加

ボタンアクションを追加

btnCreateBucketをダブルクリックして、コードを追加すします。RestSharpで送信するデータは今回はJSONです。

Public Class WebForm2
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles btnCreateBucket.Click

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

        Dim acToken As String = mdlUtils.GetToken("bucket:create")
        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.POST

            'ヘッダー
            .AddHeader("Content-Type", "application/json")
            .AddHeader("Authorization", "Bearer " + acToken)

            'ボディ(JSON形式で送る場合には匿名型を使用します。)
            '{
            '     "bucketKey":"mybucket",
            '     "policyKey":"transient"
            '}
            .AddJsonBody(New With {
                         Key .bucketKey = tbxBucketKey.Text,
                         Key .policyKey = lbxPolicy.SelectedValue
                         })
        End With

        'POSTする
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        If result.StatusCode = Net.HttpStatusCode.OK Then

            '結果(json形式の結果が文字列で返ってくる)
            '{
            '  "bucketKey":"apptestbucket",
            '  "bucketOwner":"RlKfGlAbb7N8VJwLllOvpfonB1Ex52qG",
            '  "createdDate":1463785698600,
            '  "permissions":[
            '    {
            '      "authId":"RlKffonB1Ex52GlAbb7N8VJwLllOvpqG",
            '      "access":"full"
            '    }
            '  ],
            '  "policyKey":"transient"
            '}
            Dim responseString As String = result.Content
            '文字列を操作しても可能だが、Newtonsont.JsonのJSON解読メソッドを使うと便利。
            '使い方はまず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            'バケットキーを取り出す
            Dim bucketKeyString As String = jsonObj("bucketKey")
            'ステータスに出力
            lblStatus.Text = bucketKeyString + "の作成に成功しました。"

        Else
            'エラーの場合は理由を示すJSONが返ってくる
            '            {
            '  "reason":"Valid field 'bucketKey' must be of the form  [-_.a-z0-9]{3,128}"
            '}
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            Dim reasonString As String = jsonObj("reason")
            lblStatus.Text = "バケットの作成に失敗しました。理由:" + reasonString

        End If
    End Sub
End Class

RestSharpでJSONを送る

RestSharpでBODYにJSON形式のデータをセットする場合は、赤字で示した部分のように.AddJsonBodyの引数に匿名型のオブジェクトをセットします。

実行してみる


ビルドして実行してみます。
ブラウザで実行
データ保存期間とバケットキーを指定して「バケット作成」を押すと
バケットが作成された
もう一度押すとすでに同じ名前のバケットがあることがわかります。
同じ名前のバケットは作成できない
バケットの名前に大文字のアルファベットを使うと、同じくエラーになります。
文字の制約のエラー


2017年1月15日日曜日

アクセストークン + VB.net

サーバーサイドでアクセストークンを取得する

ここまでで基本的な知識は手に入りました。ここからはASP.NET WebFormを使って、FORGEに取り組んでみます。ビューアのチュートリアルでは、JavaScriptに直接

  • オブジェクトID
  • アクセストークン

を書き込んでいました。また、アクセストークンを取得するには
  • クライアントID
  • クライアントシークレット
が必要です。しかし、クライアントサイドのJavaScriptはブラウザーの開発者ツールを使えば「もろばれ」状態なので、大事な情報をクライアントサイドに置くわけにはいきません。

今回はWebFormを使って、アクセストークンを取得してみます。Webフォームのアクションはサーバーサイドで実行されるので、大事な情報をクライアントサイドに置かなくて済みます。

まずはVisual Studioで新しいWebFormプロジェクトを作成します。

RestSharpを導入する

アクセストークンを取得するにはRESTを使って、交信を行う必要があることがわかりました。VBでこれを実装するのはなかなか骨が折れそうですが、RestSharpを使うことでこの難関を切り抜けることができます。プロジェクトにRestSharpを組み込みます。

(1) [ツール]-[NuGetパッケージマネージャ]-[パッケージマネージャコンソール]
(2) パッケージマネージャコンソールで
  PM> Install-Package RestSharp

WebFormを追加


(1) [プロジェクト]-[新しい項目の追加]
(2) [Webフォーム]を選択して[追加]
(3) 画面左下の[並べて表示]をクリック
(4) ボタンとラベルを追加

ボタンのアクションを追加

(1) 追加したボタンをダブルクリックして、コードを表示する
(2) コードは以下のようになります。

Imports System.Net

Public Class WebForm1
    Inherits System.Web.UI.Page


    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'ラベルをクリア
        Label1.Text = ""

        'クライアントIDとクライアントシークレット
        Dim client_id As String = "自分のクライアントIDで置き換え"
        Dim client_secret As String = "自分のクラインとシークレットで置き換え"

        'URL
        Dim strClient As String = "https://developer.api.autodesk.com"

        'RestSharpでクライアントを作成
        Dim _client As New RestSharp.RestClient(strClient)
        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "authentication/v1/authenticate"

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

            'ヘッダー
            .AddHeader("Content-Type", "application/x-www-form-urlencoded")

            'ボディ
            .AddParameter("client_id", client_id)
            .AddParameter("client_secret", client_secret)
            .AddParameter("grant_type", "client_credentials")

            'スコープはとりあえずdata:read
            .AddParameter("scope", "data:read")
        End With

        'リクエストを送信
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        If result.StatusCode = HttpStatusCode.OK Then

            '結果(json形式の結果が文字列で返ってくる)
            'このjsonは以下の形式となる
            '{
            '  "token_type": "Bearer",
            '  "expires_in": 1799,
            '  "access_token": "Ff387cyQXw1elOT3nldiFIKBqDOs"
            '}
            Dim responseString As String = result.Content
            'ここからaccess_tokenの値だけを取り出す

            '文字列を操作しても可能だが、Newtonsont.Jsonの解読メソッドを使うと便利です。
            '使い方はまず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object =  Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)

            'アクセストークンをオブジェクトに引数を与えて取得します
            Dim acToken As String = jsonObj("access_token")

            'Label1の表示を変更
            Label1.Text = acToken

        Else
            '失敗した場合
            Label1.Text = "アクセストークンを取得できませんでした。"

        End If

    End Sub
End Class

ポイントはRestSharpのリクエストの作り方と、戻り値のJSONからaccess_tokenの値と取り出す部分です。Newtonsoft.Jsonは規定でASP.netに組み込まれているので、特に参照を操作する必要はありません。

実行してみる


ビルドして実行してみます。最初の画面はこうです。
ボタンを押してみましょう
ボタンを押すと
アクセストークンが取得できた!
アクセストークンが取得できました。
結構少ないコードで、安全にアクセストークンを取得できることがわかりました。

2016年12月8日木曜日

バケットの作成

バケットって?

バケットとは、FORGEが提供している、アナタ専用のストレージです。今回はこのバケットを作成してみます。手順は

  1. バケット作成用のアクセストークンを取得する。
  2. バケットを作成する。

の二段階です。この手順ですが、チュートリアルが提供されているので、これを実行してみましょう。

Create an App-Managed Bucket and Upload a File
アプリ用バケットを作成して、ファイルをアップロードする


というまさに今回の目的にピッタリのチュートリアルです。ただし、Before You Begin (始める前に)のところを見てみると、

Make sure that you have registered an app and successfully acquired an OAuth token with scopes bucket:create, bucket:read, and data:write. This will allow you to create a bucket, get bucket details, and upload a file.

アプリケーションを登録し、アクセストークンを「bucket:create」、「bucket:read」、「data:write.」の各スコープを使って取得してください。これらのスコープを使って得たアクセストークンは、「バケットを作る」、「バケットの詳細情報を得る」、「バケットにファイルをアップロードする」ためのトークンとなります。

などとかいています。ということは、これからバケットを新たに作成するのですから

スコープを[bucket:create]として、アクセストークンを取得


しておく必要があるってことですねー。ではまず、前回の例にならってアクセストークンを手に入れてみます。こちらにHTTPリクエストに必要な項目が書かれています。それによると

Method and URI

POST    https://developer.api.autodesk.com/authentication/v1/authenticate

Headers

Content-Type  application/x-www-form-urlencoded

Body Structure

client_id      前回同様、アプリケーションの登録画面にあります。
client_secret   アプリケーションの登録画面にあります
grant_type    必ず「client_credentials」に設定します。
scope       今回は「bucket:create」です。

必要な情報がわかったところで、DHCを起動して設定します。
DHCに必要事項を設定して[Send]
これで、「200 OK」の返事が来るはずです。
説明を追加
もう、アクセストークンを取得するのは、慣れましたね。

Step1:Create a bucket

では、チュートリアルに戻ります。チュートリアルには

Before uploading a file, create a bucket and set a retention policy using the POST buckets endpoint.

ファイルをアップロードする前にバケットを作成し、ファイルを保持する期間を決めてください。

と書いています。バケットにはアップロードされたファイルを保持する期間があります。マニュアルにはこちらに書いています。

Transient

24時間保持

Temporary

30日間保持。

Persistent

ずっと保持。

この3種類です。チュートリアルではTransientを選択しています。
では作成してみましょう・・・・と言いたいところですが、マニュアルの例はcURLコマンドラインによる解説なので、こちらをみて必要な情報を確認しましょう。

これによると、
今回のData Format はJSON
バケットを作成する場合はリクエスト(要求)、レスポンス(回答)ともにJSON形式です。う(*_*)、JSONって何?というわけでWikiを見てみると・・・・

  • JSON(ジェイソン、JavaScript Object Notation)は軽量なデータ記述言語の1つである。

となっていました。えー?JavaScript ぉー(´・ω・`)。そんなもん知らんぞ!

そして、その書式は

  • {キー:値,キー:値・・・・・・}

です。なんだ、簡単じゃん。文字列の書式のことね。これならいけそう。
さらに、だんだんわかってきたのですが、HTTPリクエストには「ヘッダー」と「ボディ」があり、これはDHCの以下の部分に相当するようです。
DHCの画面もヘッダーとボディに分かれている

では、DHCでリクエストの送信先などを設定しましょう。

リクエストの送信先(endpointというらしい)

https://developer.api.autodesk.com/oss/v2/buckets

メソッド

POST

そしてBODYの書式がJSONなので、BOSYの右端の▼をおしてtextを選択します。残念ながらJSONという選択肢はありません。ですが上記したように簡単な書式なのでtextで十分です。
BODYの書式をtextにする

ヘッダーの設定

ヘッダーは次のように指定されています。
ヘッダーに設定する情報

Authorization

Bearer アクセストークン

Content-Type

必ず「application/json」

x-ads-region

バケットの保存先。USとEMEAが選択できます。USはアメリカで、EMEAはヨーロッパ、中東、アフリカを示すようです。おそらく物理的なサーバーの位置を言ってるのだとは思いますが、詳細はよくわかりません。必須ではないので、今回は指定しません。

DHCのヘッダーの設定は下の図のようになります。
Bearer(半角スペース)アクセストークン
ボディの設定
ボディ部分で必ず必要な項目は二つだけです。

bucketKey バケットの名前

A unique name you assign to a bucket. It must be globally unique across all applications and
regions, otherwise the call will fail. Possible values: -_.a-z0-9 (between 3-128 characters in
length). Note that you cannot change a bucket key.

グローバルにユニーク、つまり世界でただ一つの名前である必要があります。文字は3以上128以下の文字数で、小文字のアルファベット、数字、-と_と.が使えるそうです。

policyKey

これが上で説明した、ファイルの保持期間で「transient, temporary, persistent」の三つをえらぶことができます。

それではDHCのBODY部分を設定します。文字は""で囲むようにします。
BODYの記述 2行目の末尾に,が必要
バケットの名前は世界でただ一つだけなければならないので特徴的な名前を付ける必要がありますね。それでは[Send]を押してみます。

バケットづくり成功!

反応が返ってきて[200 OK]と出れば成功です。
200 OK バケット作成成功
返ってきたデータをみると以下のようになっています。

{
  "bucketKey": "blacksmithbucket1203",
  "bucketOwner": "n3bCMAZLQ6bRw7t72nNeG4qEsvO7PGYR",
  "createdDate": 1480727832782,
  "permissions":[
      {
         "authId": "n3bCMAZLQ6bRw7t72nNeG4qEsvO7PGYR",
         "access": "full"
      }
   ],
   "policyKey": "transient"
}

無事バケットを作成することができました。ここで、もう一度Sendボタンを押してみます。すると
エラーメッセージ
今度はエラーになりました。reasonのところに「この名前のバケットはすでに存在しています。」というメッセージが出ました。同じ名前のバケットを複数作ることはできないということですね。なにせ世界で唯一の名前でなければならないので、慎重に名前を設定する必要があります。

つぎに、BODYの名前を「Blacksmithbucket1203」など、大文字のアルファベットを入れて、再度[Send]を押してみます。
エラーメッセージ
今度は、400 Bad Request と返されて、reasonに「使える文字は-_.アルファベット小文字と数字で3以上128文字以下」という、命名規則の制限事項が喚起されています。

なかなか、親切じゃないですか!

次回は、このバケットにデータをアップロードしてみます。