Web API を使用したポータル操作 (プレビュー)

[この記事はプレリリース文書ですので、変更されることがあります。]

ポータルで、利用可能な WebAPI 操作 をおこなうことができます。 Web API 操作は、HTTP リクエストとレスポンスで構成されています。 この記事では、サンプル操作、メソッド、URI、および HTTP リクエストで使用できるサンプル JSON を示します。

重要

エンティティ レコードを作成する

基本的な作成

操作 メソッド URI JSON サンプル
基本的な作成 POST [Portal URI]/_api/accounts {"name":"Sample Account"}

たとえば、 エンティティ セットに投稿された次の要求本文は、アカウントの作成のコンテキストで—取引先企業など—合計 4 つの新しいエンティティを作成します。

  • 取引先担当者が作成されます。これは、取引先担当者が単一値のナビゲーション プロパティの primarycontactid として定義されているためです。
  • 営業案件が作成されます。これは、営業案件が、コレクション値を持つナビゲーション プロパティの営業案件顧客アカウントの値に設定された配列内のオブジェクトとして定義されているためです。
  • タスクが作成されます。これは、タスクが、コレクション値を持つナビゲーション プロパティの営業案件タスクの値に設定された配列内のオブジェクトとして定義されているためです。
{
 "name": "Sample Account",
 "primarycontactid":
 {
     "firstname": "Alton",
     "lastname": "Stott"
 },
 "opportunity_customer_accounts":
 [
  {
      "name": "Opportunity associated to Sample Account",
      "Opportunity_Tasks":
      [
       { "subject": "Task associated to opportunity" }
      ]
  }
 ]
}

作成時にエンティティ レコードを関連付ける

操作 メソッド URI JSON サンプル
作成時にエンティティ レコードを関連付ける POST [Portal URI]/_api/accounts {"name":"Sample Account","primarycontactid@odata.bind":"/contacts(00000000-0000-0000-0000-000000000001)"}

WebAPI を介して注釈を作成するためのサンプル JSON

{
    "new_attribute1": "test attribute 1",
    "new_attribute2": "test attribute 2",
    "new_comments": "test comments",
    "new_recordurl": recordURL,
    "new_feedback_Annotations":
        [
            {
                "notetext": "Screenshot attached",
                "subject": "Attachment",
                "filename": file.name,
                "mimetype": file.type,
                "documentbody": base64str,
            }
        ]
    }

documentbody は添付ファイルを base64 文字列として含みます。

Web API を使用したエンティティの更新と削除

基本的な更新

操作 メソッド URI JSON サンプル
基本的な更新 PATCH [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000001) { "name": "Updated Sample Account ", "creditonhold": true, "address1_latitude": 47.639583, "description": "This is the updated description of the sample account", "revenue": 6000000, "accountcategorycode": 2 }

単一のプロパティ値の更新

操作 メソッド URI JSON サンプル
単一のプロパティ値の更新 PUT [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000001)/name {"value": "Updated Sample Account Name"}

単一のプロパティ値の削除

操作 メソッド URI
単一のプロパティ値の削除 DELETE [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000001)/description

基本的な削除

操作 メソッド URI
基本的な削除 DELETE [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000001)

Web API を使用したエンティティの関連付けと関連付け解除

コレクション値ナビゲーション プロパティへの参照の追加

操作 メソッド URI JSON サンプル
コレクション値ナビゲーション プロパティへの参照の追加 投稿 [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000002)/opportunity_customer_accounts/$ref {"@odata.id":"[Portal URI]/_api/opportunities(00000000-0000-0000-0000-000000000001)"}

エンティティへの参照の削除

操作 メソッド URI
エンティティへの参照の削除 DELETE [Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000002)/opportunity_customer_accounts/$ref?$id=[Portal URI]/_api/opportunities(00000000-0000-0000-0000-000000000001)

単一の値のナビゲーション プロパティのエンティティへの参照を削除する

単一の値ナビゲーション プロパティでは、$id クエリ文字列パラメーターを削除します。

操作 メソッド URI
単一の値のナビゲーション プロパティのエンティティへの参照を削除する DELETE [Portal URI]/_api/opportunities(00000000-0000-0000-0000-000000000001)/customerid_account/$ref

単一値ナビゲーション プロパティでの参照の変更

操作 メソッド URI JSON サンプル
単一値ナビゲーション プロパティでの参照の変更 PUT [Portal URI]/_api/opportunities(00000000-0000-0000-0000-000000000001)/customerid_account/$ref {"@odata.id":"[Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000002)"}

作成時にエンティティを関連付ける

新規エンティティは、deep 挿入を使用してリレーションシップを使って作成できます 。

単一値のナビゲーション プロパティを使用した更新でエンティティを関連付ける

このトピックで前述された通り、基本的な更新 で記載された同じメッセージを使用して更新時のエンティティを関連付けることができますが、@odata.bind 注釈を使用して単一値ナビゲーション プロパティの値を設定する使用する必要があります。 次の例では、customerid_account 単一値ナビゲーション プロパティを使用して営業案件に関連付けられた取引先企業を変更します。

単一値のナビゲーション プロパティを使用した更新でエンティティを関連付ける

操作 メソッド URI JSON サンプル
単一値のナビゲーション プロパティを使用した更新でエンティティを関連付ける PATCH [Portal URI]/_api/opportunities(00000000-0000-0000-0000-000000000001) {"customerid_account@odata.bind":"[Portal URI]/_api/accounts(00000000-0000-0000-0000-000000000002)"}

Web API AJAX サンプル

このサンプルは、非同期 JavaScript および XML (AJAX) を使用してエンティティ レコードを作成、更新、および削除する方法を示しています。

ラッパー AJAX 関数

    (function(webapi, $){
        function safeAjax(ajaxOptions) {
            var deferredAjax = $.Deferred();
    
            shell.getTokenDeferred().done(function (token) {
                // add headers for AJAX
                if (!ajaxOptions.headers) {
                    $.extend(ajaxOptions, {
                        headers: {
                            "__RequestVerificationToken": token
                        }
                    }); 
                } else {
                    ajaxOptions.headers["__RequestVerificationToken"] = token;
                }
                $.ajax(ajaxOptions)
                    .done(function(data, textStatus, jqXHR) {
                        validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
                    }).fail(deferredAjax.reject); //AJAX
            }).fail(function () {
                deferredAjax.rejectWith(this, arguments); // on token failure pass the token AJAX and args
            });
    
            return deferredAjax.promise();  
        }
        webapi.safeAjax = safeAjax;
    })(window.webapi = window.webapi || {}, jQuery)

作成​​

    webapi.safeAjax({
        type: "POST",
        url: "/_api/accounts",
        contentType: "application/json",
        data: JSON.stringify({
            "name": "Sample Account"
        }),
        success: function (res, status, xhr) {
      //print id of newly created entity record
            console.log("entityID: "+ xhr.getResponseHeader("entityid"))
        }
    });

Update

  webapi.safeAjax({
    type: "PATCH",
    url: "/_api/accounts(00000000-0000-0000-0000-000000000001)",
    contentType: "application/json",
    data: JSON.stringify({
      "name": "Sample Account - Updated"
    }),
    success: function (res) {
      console.log(res);
    }
  });

削除​​

    webapi.safeAjax({
        type: "DELETE",
        url: "/_api/accounts(00000000-0000-0000-0000-000000000001)",
        contentType: "application/json",
        success: function (res) {
            console.log(res);
        }
  });

この例では、サンプルスクリプトを使用して、firstnamelastnamefullnameemailaddress1telephone1 フィールドを使用して連絡先を表示、編集、作成、および削除します。

この例の手順に従って、フィールド名を変更したり、別のエンティティを使用できます。

ステップ 1 - サイト設定の作成

ポータル WebAPI を使用する前に、ポータル管理アプリで必要なサイト設定を有効にする必要があります。 このサイト設定は、Web API と対話するときに使用するエンティティによって異なります。

  1. Power Apps に移動します。

  2. 左のペインで、アプリを選択します。

  3. ポータル管理 アプリを選択します。

    ポータル管理アプリ

  4. 左側のペインの ポータル管理 アプリで、サイト設定 を選択します。

    サイト設定

  5. 新規をクリックします。

  6. 名前 ボックスに、Webapi/contact/enabled と入力します。

  7. Web サイト リストで、Web サイト レコードを選択します。

  8. 数値 ボックスに、true と入力します。

    Web API の取引先担当者が有効化された設定

  9. 保存して閉じるを選択します。

  10. 新規をクリックします。

  11. 名前 ボックスに、Webapi/contact/fields と入力します。

  12. Web サイト リストで、Web サイト レコードを選択します。

  13. ボックスで、次を入力します
    firstname,lastname,fullname,emailaddress1,telephone1

    Web API 取引先担当者フィールド

  14. 保存して閉じるを選択します。

  15. 新規をクリックします。

  16. 名前 ボックスに、Webapi/error/innererror と入力します。

  17. Web サイト リストで、Web サイト レコードを選択します。

  18. 数値 ボックスに、true と入力します。

    Web API エラー

  19. 保存して閉じるを選択します。

  20. Web API のサイト設定を検証します。

    Web API サイト設定

ステップ 2 - アクセス許可の構成

ユーザーが WebAPI 機能を使用できるように、アクセス許可を構成する必要があります。 この例では、エンティティのアクセス許可に対して連絡先エンティティを有効にし、Web API を使用するための Web ロールを作成し、連絡先エンティティのエンティティのアクセス許可をこの Web ロールに追加してから、ユーザーに Web ロールを追加してユーザーに WebAPI を使用する許可を与えます。

  1. 左側のペインの ポータル管理 アプリで、エンティティのアクセス許可 を選択します。

  2. 新規をクリックします。

  3. 名前 ボックスに、Contact Entity Permission を入力します。

  4. エンティティ名 リストで、連絡先 (連絡先) を選択します。

  5. Web サイト リストで、Web サイト レコードを選択します。

  6. 範囲 リストで、グローバル を選択します。

  7. 読み取り書き込み作成削除 の特権を選択します。

  8. 保存して閉じるを選択します。

    エンティティのアクセス許可

  9. 左ペインで、Web ロール を選択します。

  10. 新規をクリックします。

  11. 名前 ボックスに、Web API ユーザー を入力します。

  12. Web サイト リストで、Web サイト レコードを選択します。

  13. 認証されたユーザーの役割 に対し、はい を選択します。

    Web ロール

  14. 保存を選択します。

  15. 関連 > エンティティのアクセス許可 を選択します。

    関連するエンティティのアクセス許可

  16. 既存のエンティティ アクセス許可を追加 を選択します。

  17. 前で作成した、取引先担当者エンティティのアクセス権限 を選択します。

  18. 追加 を選択します。

    取引先担当者エンティティのアクセス許可を Web API ユーザー Web ロールに追加する

  19. 保存して閉じるを選択します。

    Web API ユーザーの Web ロール エンティティのアクセス許可

  20. 左側ペインで、取引先担当者 を選択します。

  21. Web API に対してこの例を使用する取引先担当者を選択します。

    注意

    この取引先担当者は、この例で WebAPI をテストするために使用されるユーザー アカウントです。 必ずポータルで正しい連絡先を選択してください。

  22. 関連 > Web ロール を選択します。

    ユーザーの Web ロール

  23. 既存の Web ロールの追加を選択します。

  24. 以前に作成した、WebAPI ユーザー ロールを選択します。

  25. 追加 を選択します。

    ユーザーに追加された Web ロール

  26. 保存して閉じるを選択します。

ステップ 3 - Web ページの作成

Web API を有効にし、ユーザー権限を構成したので、レコードを表示、編集、作成、および削除するためのサンプルコードを使用して Web ページを作成します。

  1. 左側のペインの ポータル管理 アプリで、Web ページ を選択します。

  2. 新規をクリックします。

  3. 名前 ボックスに、webapi と入力します。

  4. Web サイト リストで、Web サイト レコードを選択します。

  5. 親ページ には、ホーム を選択します。

  6. 部分的な URL には、webapi と入力します。

  7. 親テンプレート には、ホーム を選択します。

  8. 公開状況 には、 公開済み を選択します。

  9. 保存を選択します。

    Web ページ

  10. 関連 > Web ページ を選択します。

    関連する Web ページ

  11. Web ページ関連ビュー から、webapi を選択します。

    Web ページ関連ビュー

  12. コンテンツ セクションまでスクロール ダウンして、コピー (HTML) ( + +HTML デザイナー) へと移動します。

    HTML デザイナー

  13. HTML タブを選択します。

    HTML タブを選択します

  14. 次のサンプル コード スニペットをコピーして、HTML デザイナーに貼り付けます。

        <!-- Sample code for Web API demonstration -->
    <style>
        #processingMsg {
            width: 150px;
            text-align: center;
            padding: 6px 10px;
            z-index: 9999;
            top: 0;
            left: 40%;
            position: fixed;
            -webkit-border-radius: 0 0 2px 2px;
            border-radius: 0 0 2px 2px;
            -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
            display: none;
        }
    
        table td[data-attribute] .glyphicon-pencil {
            margin-left: 5px;
            opacity: 0;
        }
    
        table td[data-attribute]:hover .glyphicon-pencil {
            opacity: 0.7;
        }
    </style>
    {% fetchxml contactList %}
    <fetch version="1.0" mapping="logical">
        <entity name="contact">
            <attribute name="fullname"></attribute>
            <attribute name="firstname"></attribute>
            <attribute name="lastname"></attribute>
            <attribute name="contactid"></attribute>
            <attribute name="emailaddress1"></attribute>
            <attribute name="telephone1"></attribute>
            <order attribute="contactid" descending="false"></order>
        </entity>
    </fetch>
    {% endfetchxml %}
    <script>
        //Add the contact data in json object
        var contactList = [
            {% for entity in contactList.results.entities %}
        {
            id: "{{entity.contactid}}",
                fullname: "{{entity.fullname}}",
                    firstname: "{{ entity.firstname }}",
                        lastname: "{{ entity.lastname }}",
                            emailaddress1: "{{ entity.emailaddress1 }}",
                                telephone1: "{{ entity.telephone1 }}"
        } {% unless forloop.last %}, {% endunless %}
        {% endfor %}  
    ];
        $(function () {
            //Web API ajax wrapper
            (function (webapi, $) {
                function safeAjax(ajaxOptions) {
                    var deferredAjax = $.Deferred();
                    shell.getTokenDeferred().done(function (token) {
                        // Add headers for ajax
                        if (!ajaxOptions.headers) {
                            $.extend(ajaxOptions, {
                                headers: {
                                    "__RequestVerificationToken": token
                                }
                            });
                        } else {
                            ajaxOptions.headers["__RequestVerificationToken"] = token;
                        }
                        $.ajax(ajaxOptions)
                            .done(function (data, textStatus, jqXHR) {
                                validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
                            }).fail(deferredAjax.reject); //ajax
                    }).fail(function () {
                        deferredAjax.rejectWith(this, arguments); // On token failure pass the token ajax and args
                    });
                    return deferredAjax.promise();
                }
                webapi.safeAjax = safeAjax;
            })(window.webapi = window.webapi || {}, jQuery)
            // Notification component
            var notificationMsg = (function () {
                var $processingMsgEl = $('#processingMsg'),
                    _msg = 'Processing...',
                    _stack = 0,
                    _endTimeout;
                return {
                    show: function (msg) {
                        $processingMsgEl.text(msg || _msg);
                        if (_stack === 0) {
                            clearTimeout(_endTimeout);
                            $processingMsgEl.show();
                        }
                        _stack++;
                    },
                    hide: function () {
                        _stack--;
                        if (_stack <= 0) {
                            _stack = 0;
                            clearTimeout(_endTimeout);
                            _endTimeout = setTimeout(function () {
                                $processingMsgEl.hide();
                            }, 500);
                        }
                    }
                }
            })();
            // Inline editable table component
            var webAPIExampleTable = (function () {
                var trTpl = '<% _.forEach(data, function(data){ %>' +
                    '<tr data-id="<%=data.id%>" data-name="<%=data.fullname%>">' +
                    '<% _.forEach(columns, function(col){ %>' +
                    '<td data-attribute="<%=col.name%>" data-label="<%=col.label%>" data-value="<%=data[col.name]%>">' +
                    '<%-data[col.name]%><i class="glyphicon glyphicon-pencil"></i>' +
                    '</td>' +
                    '<% }) %>' +
                    '<td>' +
                    '<button class="btn btn-default delete" type="submit"><i class="glyphicon glyphicon-trash" aria-hidden="true"></i></button>' +
                    '</td>' +
                    '</tr>' +
                    '<% }) %>';
                var tableTpl = '<table class="table table-hover">' +
                    '<thead>' +
                    '<tr>' +
                    '<% _.forEach(columns, function(col){ %>' +
                    '<th><%=col.label%></th>' +
                    '<% }) %>' +
                    '<th>' +
                    '<button class="btn btn-default add" type="submit">' +
                    '<i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add Sample Record' +
                    '</button>' +
                    '</th>' +
                    '</tr>' +
                    '</thead>' +
                    '<tbody>' + trTpl + '</tbody>' +
                    '</table>';
                function getDataObject(rowEl) {
                    var $rowEl = $(rowEl),
                        attrObj = {
                            id: $rowEl.attr('data-id'),
                            name: $rowEl.attr('data-name')
                        };
                    $rowEl.find('td').each(function (i, el) {
                        var $el = $(el),
                            key = $el.attr('data-attribute');
                        if (key) {
                            attrObj[key] = $el.attr('data-value');
                        }
                    })
                    return attrObj;
                }
                function bindRowEvents(tr, config) {
                    var $row = $(tr),
                        $deleteButton = $row.find('button.delete'),
                        dataObj = getDataObject($row);
                    $.each(config.columns, function (i, col) {
                        var $el = $row.find('td[data-attribute="' + col.name + '"]');
                        $el.on('click', $.proxy(col.handler, $el, col, dataObj));
                    });
                    //User can delete record using this button
                    $deleteButton.on('click', $.proxy(config.deleteHandler, $row, dataObj));
                }
                function bindTableEvents($table, config) {
                    $table.find('tbody tr').each(function (i, tr) {
                        bindRowEvents(tr, config);
                    });
                    $table.find('thead button.add').on('click', $.proxy(config.addHandler, $table));
                }
                return function (config) {
                    var me = this,
                        columns = config.columns,
                        data = config.data,
                        addHandler = config.addHandler,
                        deleteHandler = config.deleteHandler,
                        $table;
                    me.render = function (el) {
                        $table = $(el).html(_.template(tableTpl)({ columns: columns, data: data })).find('table');
                        bindTableEvents($table, { columns: columns, addHandler: addHandler, deleteHandler: deleteHandler });
                    }
                    me.addRecord = function (record) {
                        $table.find('tbody tr:first').before(_.template(trTpl)({ columns: columns, data: [record] }));
                        bindRowEvents($table.find('tbody tr:first'), config);
                    }
                    me.updateRecord = function (attributeName, newValue, record) {
                        $table.find('tr[data-id="' + record.id + '"] td[data-attribute="' + attributeName + '"]').text(newValue);
                    }
                    me.removeRecord = function (record) {
                        $table.find('tr[data-id="' + record.id + '"]').fadeTo("slow", 0.7, function () {
                            $(this).remove();
                        });
                    }
                };
            })();
            //Applicaton ajax wrapper 
            function appAjax(processingMsg, ajaxOptions) {
                notificationMsg.show(processingMsg);
                return webapi.safeAjax(ajaxOptions)
                    .fail(function (response) {
                        if (response.responseJSON) {
                            alert("Error: " + response.responseJSON.error.message)
                        } else {
                            alert("Error: Web API is not available... ")
                        }
                    }).always(notificationMsg.hide);
            }
            function addSampleRecord() {
                //Sample data to create a record - change as appropriate
                var recordObj = {
                    firstname: "Willie",
                    lastname: "Huff" + _.random(100, 999),
                    emailaddress1: "Willie.Huff@contoso.com",
                    telephone1: "555-123-4567"
                };
                appAjax('Adding...', {
                    type: "POST",
                    url: "/_api/contacts",
                    contentType: "application/json",
                    data: JSON.stringify(recordObj),
                    success: function (res, status, xhr) {
                        recordObj.id = xhr.getResponseHeader("entityid");
                        recordObj.fullname = recordObj.firstname + " " + recordObj.lastname;
                        table.addRecord(recordObj);
                    }
                });
                return false;
            }
            function deleteRecord(recordObj) {
                var response = confirm("Are you sure, you want to delete \"" + recordObj.name + "\" ?");
                if (response == true) {
                    appAjax('Deleting...', {
                        type: "DELETE",
                        url: "/_api/contacts(" + recordObj.id + ")",
                        contentType: "application/json",
                        success: function (res) {
                            table.removeRecord(recordObj);
                        }
                    });
                }
                return false;
            }
            function updateRecordAttribute(col, recordObj) {
                var attributeName = col.name,
                    value = recordObj[attributeName],
                    newValue = prompt("Please enter \"" + col.label + "\"", value);
                if (newValue != null && newValue !== value) {
                    appAjax('Updating...', {
                        type: "PUT",
                        url: "/_api/contacts(" + recordObj.id + ")/" + attributeName,
                        contentType: "application/json",
                        data: JSON.stringify({
                            "value": newValue
                        }),
                        success: function (res) {
                            table.updateRecord(attributeName, newValue, recordObj);
                        }
                    });
                }
                return false;
            }
            var table = new webAPIExampleTable({
                columns: [{
                    name: 'firstname',
                    label: 'First Name',
                    handler: updateRecordAttribute
                }, {
                    name: 'lastname',
                    label: 'Last Name',
                    handler: updateRecordAttribute
                }, {
                    name: 'emailaddress1',
                    label: 'Email',
                    handler: updateRecordAttribute
                }, {
                    name: 'telephone1',
                    label: 'Telephone',
                    handler: updateRecordAttribute
                }],
                data: contactList,
                addHandler: addSampleRecord,
                deleteHandler: deleteRecord
            });
            table.render($('#dataTable'));
        });
    </script>
    <div id="processingMsg" class="alert alert-warning" role="alert"></div>
    <div id="dataTable"></div>
    

    コードをコピーして貼り付けます

  15. 保存して閉じるを選択します。

ステップ 4 - ポータルのキャッシュをクリアする

Web API 機能をテストするための webapi サンプルページを作成しました。 始める前に、Power Apps ポータル管理アプリからの変更がポータルに反映されるように、ポータル キャッシュがクリアされました。

重要

ポータルのサーバー側キャッシュをクリアすることにより、Common Data Service から再度読み込みをしている間、一時的にポータルのパフォーマンスが低下します。

キャッシュをクリアするには、

  1. 管理者の Web ロールのメンバーとしてポータルにサインインします。

  2. 最後に /_services/about を追加して URL を変更します。 たとえば、ポータル URL が https://contoso.powerappsportals.com の場合、https://contoso.powerappsportals.com/_services/about に変更します。

    ページに関するポータル サービス

    注意

    キャッシュをクリアするには、管理者 Webロールのメンバーでなければなりません。 空白のスクリーンが表示される場合は、Web ロールの割り当てを確認してください。

  3. キャッシュのクリアを選びます。

詳細: ポータルのサーバー サイド キャッシュをクリアする

ステップ 5 - WebAPI を使用して、表示、編集、作成、および削除する

この例の前半で作成した URL webapi を使ってサンプル webpage のテストの準備ができました。

Web API 機能をテストするには:

  1. 以前に作成した WebAPI ユーザー ロールに割り当てられたユーザー アカウントでポータルにログインします。

  2. 以前に作成された webapi Webページに移動します。 たとえば、https://contoso.powerappsportals.com/webapi などとします。

    サンプル  webapi webpage

  3. サンプル レコードを追加 を選択して、スクリプトからサンプル レコードを追加します。

  4. フィールドを選択します。 この例では、E メール を選択して、取引先担当者のメール アドレスを変更します。

    電子メールの編集

  5. レコードの削除 を選択して、レコードを削除します。

この例では、レコードを表示、編集、作成、および削除するためのサンプルを使用して Web ページを作成したので、フォームとレイアウトをカスタマイズできます。

次のステップ

HTTP 要求の作成とエラーの処理

関連項目

Web API 概要