Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu kılavuzda, dış hizmetler httpclient sunucu nesnesindeki kayıtları okumak, yazmak, güncelleştirmek ve silmek için sunucu mantığını kullanacak bir web sayfası ayarlayacaksınız.
Uyarı
Bu örnekte kullanılır https://services.odata.org/TripPinRESTierService , ancak diğer genel kullanıma açık ücretsiz test araçlarını kullanabilirsiniz.
1. Adım: Sunucu mantığı oluşturma
Power Pages'de oturum açın.
Site + Düzenle'yi seç.
Çalışma alanını ayarla'ya gidin, ardından Sunucu mantığı (önizleme) seçeneğini belirleyin
+Yeni sunucu mantığını seçin
Sunucu mantığı için ad girin. Bu ad API'de sunucu mantığı API'si oluşturulurken kaynak tanımlayıcısı olarak kullanılır. Örneğin:
Mülkiyet Örnek Değer İsim services.odata.orgKolay Ad Performing CRUD operations using OData serviceUygun web rolünü atamak için +Rol ekle'yi seçin.
Bu örnekte , Devam etmek için Yöneticiler'i seçin ve daha sonra yönetici olarak oturum açın.Add (Ekle) seçeneğini belirleyin.
Sunucu mantığını seçin ve Kodu düzenle'yi seçin.
Özel mantığı yazmak için Web için Microsoft Visual Studio Code'da düzenleme iletişim kutusunda, Visual Studio Code'u Aç'ı seçin.
Önceden tanımlanmış yöntemleri ve betikleri dosyada bulabilirsiniz.
Dış hizmeti kullanarak işlemleri okumak, düzenlemek, oluşturmak, silmek için sunucu mantığı yöntemini tanımlayın.
Aşağıdaki sabiti
baseUrlyöntemindenget()önce ekleyinconst baseUrl = "https://services.odata.org/TripPinRESTierService";get,post,putvedelörnek işlevlerini aşağıdaki kodla değiştirinasync function get() { try { Server.Logger.Log("GET called"); // Logger reference if (!Server.Context.QueryParameters["username"]) { const response = await Server.Connector.HttpClient.GetAsync( `${baseUrl}/People?$select=UserName,FirstName,LastName,MiddleName,Age`, {'content-type':'application/json'}); return response; } else { const id = Server.Context.QueryParameters["username"]; // Context reference const response = await Server.Connector.HttpClient.GetAsync( `${baseUrl}(${id})/People?$select=UserName,FirstName,LastName,MiddleName,Age`, {'content-type':'application/json'}); return response; } } catch (err) { Server.Logger.Error("GET failed: " + err.message); return JSON.stringify({ status: "error", method: "GET", message: err.message }); } } async function post() { try { Server.Logger.Log("POST called"); const data = JSON.parse(Server.Context.Body); const url = `${baseUrl}/${data.serviceSession}/People`; const { serviceSession, ...body } = data; const response = await Server.Connector.HttpClient.PostAsync( url, JSON.stringify(body), {'content-type':'application/json'}); return response; } catch (err) { Server.Logger.Error("POST failed: " + err.message); return JSON.stringify({ status: "error", method: "POST", message: err.message }); } } async function put() { try { Server.Logger.Log("PUT called"); const data = JSON.parse(Server.Context.Body); const url = `${baseUrl}/${data.serviceSession}/People('${data.UserName}')`; const { UserName, ...body1 } = data; const { serviceSession, ...body } = body1; const response = await Server.Connector.HttpClient.PatchAsync( url, JSON.stringify(body), {'content-type':'application/json'}); return response; } catch (err) { Server.Logger.Error("PUT failed: " + err.message); return JSON.stringify({ status: "error", method: "PUT", message: err.message }); } } async function del() { try { // "delete" keyword should not be used in script file. Server.Logger.Log("DEL called"); const username = Server.Context.QueryParameters["username"]; const serviceSession = Server.Context.QueryParameters["serviceSession"]; const url = `${baseUrl}/${serviceSession}/People('${username}')`; const response = await Server.Connector.HttpClient.DeleteAsync( url, {'content-type':'application/json'}); return response; } catch (err) { Server.Logger.Error("Deletion failed: " + err.message); return JSON.stringify({ status: "error", method: "DEL", message: err.message }); } }Dosyayı kaydedin.
Tavsiye
Kaydetmek için Ctrl+S kullanın.
2. Adım: Web Sayfası Oluşturma
Power Pages design studio'yu başlatın.
Sayfalar çalışma alanında + Sayfa'yı seçin.
Bir sayfa oluşturmak için sayfayı açıklayın iletişim kutusunda Diğer sayfa ekleme yöntemleri'ni seçin.
Sayfa ekle iletişim kutusunda ayrıntıları girin.
- Ad kutusuna Sunucu mantığı girin ve Boştan başla düzenini seçin.
- Add (Ekle) seçeneğini belirleyin.
Sağ üst köşedeki Kodu Düzenle seçeneğini belirleyin.
Web için Visual Studio Code'da Düzenle iletişim kutusundaVisual Studio Code'ı Aç'ı seçin.
HTML sayfasında bulunan kodu aşağıdakilerle değiştirin:
<div class="row sectionBlockLayout text-left" style="min-height: auto; padding: 8px;"> <div class="container" style="display: flex; flex-wrap: wrap;"> <div class="col-md-12 columnBlockLayout" style="padding: 16px; margin: 60px 0px; min-height: 200px;"> <!-- Sample code for Web API demonstration --> <style> #processingMsg { padding: 6px 12px; background: #eee; border-radius: 4px; position: fixed; top: 10px; left: 50%; transform: translateX(-50%); display: none; z-index: 9999; text-align: center; font-weight: bold; } table { border-collapse: collapse; width: 100%; margin-top: 10px; font-family: Arial, sans-serif; } th, td { border: 1px solid #ccc; padding: 6px; text-align: left; } button { cursor: pointer; border: 1px solid #aaa; padding: 4px 8px; border-radius: 4px; background: #fff; font-size: 14px; margin-right: 2px; } button.add { color: green; } button.save { color: green; } button.cancel { color: orange; } button.delete { color: red; } input { width: 95%; box-sizing: border-box; } td.actions { white-space: nowrap; } td[data-attribute="UserName"] { background: #f9f9f9; cursor: default; } </style> <div id="processingMsg">Processing...</div> <div id="dataTable"></div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function () { // Safe WebAPI wrapper for Power Pages (function (webapi, $) { function safeAjax(opts) { var d = $.Deferred(); shell.getTokenDeferred().done(function (token) { opts.headers = opts.headers || {}; opts.headers["__RequestVerificationToken"] = token; $.ajax(opts) .done((data, ts, jq) => validateLoginSession(data, ts, jq, d.resolve)) .fail(d.reject); }).fail(() => d.rejectWith(this, arguments)); return d.promise(); } webapi.safeAjax = safeAjax; })(window.webapi = window.webapi || {}, jQuery); // Notification overlay const notify = (() => { const $m = $('#processingMsg'); let s = 0, t; return { show: (msg = 'Processing...') => { $m.text(msg); if (!s) $m.show(); s++; }, hide: () => { s = Math.max(0, s - 1); if (!s) t = setTimeout(() => $m.hide(), 200); } }; })(); function ajaxCall(msg, opts) { notify.show(msg); return webapi.safeAjax(opts) .fail(r => alert(r.responseJSON?.error?.message || 'Server error')) .always(notify.hide); } // Table columns const cols = [ { name: 'UserName', label: 'User Name', editable: false }, { name: 'FirstName', label: 'First Name' }, { name: 'LastName', label: 'Last Name' }, { name: 'MiddleName', label: 'Middle Name' }, { name: 'Age', label: 'Age' } ]; let data = []; let serviceSession = ''; function render() { const html = `<table> <thead> <tr> ${cols.map(c => `<th>${c.label}</th>`).join('')} <th>Actions <button class="add">➕</button></th> </tr> </thead> <tbody> ${data.map(r => `<tr data-UserName="${r.UserName}"> ${cols.map(c => `<td data-attribute="${c.name}" data-value="${r[c.name] || ''}"> ${r[c.name] || ''} </td>`).join('')} <td class="actions"> <button class="delete">🗑️</button> </td> </tr>`).join('')} </tbody> </table>`; $('#dataTable').html(html); } // Double click row to edit except username $('#dataTable').on('dblclick', 'tr', function () { const $tr = $(this); if ($tr.hasClass('editing')) return; $tr.addClass('editing'); $tr.find('td[data-attribute]').each(function () { const $td = $(this); if ($td.data('attribute') === 'UserName') return; const old = $td.text().trim(); $td.html(`<input type="text" value="${old}" data-attr="${$td.data('attribute')}"/>`); }); $tr.find('.actions').append('<button class="save">✅</button><button class="cancel">❌</button>'); }); $('#dataTable').on('click', '.save', function () { const $tr = $(this).closest('tr'); const username = $tr.data('username'); const updates = {}; $tr.find('input').each(function () { const attr = $(this).data('attr'); let value = $(this).val().trim(); if (attr === 'Age') { value = Number(value); if (isNaN(value)) value = null; // safety fallback } updates[attr] = value; }); ajaxCall('Updating...', { type: 'PUT', url: `/_api/serverlogics/services.odata.org`, contentType: 'application/json', data: JSON.stringify(Object.assign({ UserName: username, serviceSession: `${serviceSession}` }, updates)), success: () => { Object.assign(data.find(x => x.UserName === username), updates); render(); } }); }); $('#dataTable').on('click', '.cancel', () => render()); $('#dataTable').on('click', '.delete', function () { const username = $(this).closest('tr').data('username'); if (!confirm('Delete ' + username + '?')) return; ajaxCall('Deleting...', { type: 'DELETE', url: `/_api/serverlogics/services.odata.org?username=${username}&serviceSession=${serviceSession}`, success: () => { data = data.filter(x => x.UserName !== username); render(); } }); }); $('#dataTable').on('click', '.add', function () { const r = { serviceSession: `${serviceSession}`, UserName: 'user' + Math.floor(Math.random() * 9000 + 1000), FirstName: 'New', LastName: 'Person', MiddleName: '', Age: 25 }; ajaxCall('Adding...', { type: 'POST', url: `/_api/serverlogics/services.odata.org`, contentType: 'application/json', data: JSON.stringify(r), success: () => { data.unshift(r); render(); } }); }); // Initial load ajaxCall('Loading...', { type: 'GET', url: `/_api/serverlogics/services.odata.org`, contentType: 'application/json' }).done(resp => { const parsed = JSON.parse(resp.data); const body = JSON.parse(parsed.Body); const ctx = body['@odata.context']; const match = ctx.match(/\\S\\[^)]*\\/); serviceSession = match ? match[0] : ''; data = (body.value || []).map(r => ({ UserName: r.UserName, FirstName: r.FirstName, LastName: r.LastName, MiddleName: r.MiddleName, Age: r.Age })); render(); }); }); </script> </div> </div> </div>Dosyayı kaydetme
Uyarı
Bu kod, Power Pages sunucu mantığını kullanarak dış OData hizmetiyle CRUD (Oluşturma, Okuma, Güncelleştirme, Silme) işlemlerini göstermek için etkileşimli bir veri tablosu arabirimi oluşturur. Yanıt veren bir tablo düzeni için CSS stili, işleme bildirimi katmanı ve kullanıcıların dış hizmetten alınan verileri görüntülemesine, düğmeye tıklayarak yeni kayıtlar eklemesine, tablo satırlarına çift tıklayarak ➕ (UserName alanı dışında) mevcut kayıtları düzenlemesine, değişiklikleri ✅ile kaydetmesine, ile ❌düzenlemeleri iptal etmesine ve ️ düğmesini kullanarak 🗑kayıtları silmesine olanak tanıyan JavaScript işlevselliğini içerir. Kod, /_api/serverlogics/services.odata.org uç noktasına kimliği doğrulanmış AJAX çağrıları yapmak, OData bağlamını ayrıştırmak ve sonraki işlemler için bir hizmet oturumunu yönetmek üzere yanıt verilerini işlemek için jQuery ve güvenli bir WebAPI sarmalayıcı kullanır.
Power pages tasarımcısına geri dönün.
Web için Visual Studio Code'da kod düzenliyorsunuz iletişim kutusunda yönergeleri izleyin ve Eşitle düğmesine tıklayın.
3. Adım: Sunucu mantığını kullanarak okuma, görüntüleme, düzenleme, oluşturma ve silme
Sunucu mantığı işlevselliğini test etmek için:
- Önizleme'yi ve ardından Masaüstü'nü seçin.
- Daha önce oluşturduğunuz Sunucu mantığı Kullanıcı rolü atanmış kullanıcı hesabıyla sitenizde oturum açın. Önceki adımda Yöneticiler rolünü seçtiğimizde, bu örnekte yönetici olarak oturum açın.
- Daha önce oluşturulan Sunucu mantığı web sayfasına gidin.
- İşlemleri doğrulayın.
İlgili bilgiler
Sunucu mantığına genel bakış
Sunucu mantığı oluşturma
Sunucu nesneleriSunucu mantığını kullanarak Dataverse tablolarıyla etkileşim kurma