AI時代的網站與手機App建置與開發Part16 - 建立具推薦功能的手機App

 ·       摘要

在上一篇文章中, 我們利用ML.NET建立了一個預測使用者對電影的評論分數預測的機器學習模型, 並利用建立妥的機器學習模型製作了一個支援使用者對電影的評論分數預測的Core MVC網站. 這篇文章中, 我們將要利用支援預測電影評論分數的機器學習模型建立能夠預測電影評論分數的手機App.

·       處理CORS安全保護問題

部署機器學習模型的Web API專案預設會啟用跨來源資源分享(Cross Origin Resource Sharing – CORS), 禁止和Web API專案不同來源的JavaScript程式呼叫, 如果要解除CORS安全保護, 可以編輯Web API專案根目錄的Program.cs, //Configure app註解下方定義CORS的開放策略:

// Configure app

string MyAllowSpecificOrigins = "AllowOrigin";

builder.Services.AddCors(options => {

    options.AddPolicy(

      name: MyAllowSpecificOrigins,

      policy => policy.WithOrigins("*").WithHeaders("*").WithMethods("*"));

});

請注意上述程式碼呼叫WithOrigins函式傳入*當做參數, 表示不限制任何JavaScript程式叫用Web API服務.

定義妥CORS開放策略後, 請於叫用appRun函式前套用前述定妥的CORS開放策略, 就可以完成解除對JavaScript程式的CORS安全管制.

app.UseCors(MyAllowSpecificOrigins);

app.Run();

·       建立基於MAUI跨平台架構的手機APP專案

請啟動Visual Studio 2022, 執行[檔案 | 新增 | 專案]功能, 選擇建立[.NET MAUI應用程式]型態的專案, 如圖1所示:

1: 使用Visual Studio 2022建立[.NET MAUI應用程式]型態的專案的畫面

·       信賴ASP.NET Core HTTPS development certificate

ASP.NET Core Web API專案會使用開發憑証(Development Certificate)Web API能夠支援用戶端使用HTTPS叫用Web API服務的功能, 但是開發憑証並未設定為被信任的憑証, 所以我們要先開啟[命令提示字元]程式, 執行下列的命令, 設定信任ASP.NET Core Web API專案使用的開發憑証:

dotnet dev-certs https --trust

·       建立HttpsClientHandlerService 類別

接下來請為專案加入以下名稱為HttpsClientHandlerService的類別, 負責設定執行在Android模擬器的MAUI手機程式和執行在iOS模擬器的MAUI手機程式信任本機電腦的自我簽署憑証:

public class HttpsClientHandlerService

{

    public HttpMessageHandler GetPlatformMessageHandler()

    {

#if ANDROID

        var handler = new Xamarin.Android.Net.AndroidMessageHandler();

        handler.ServerCertificateCustomValidationCallback =                                                     (message, cert, chain, errors) =>

        {

            if (cert != null && cert.Issuer.Equals("CN=localhost"))

                return true;

            return errors == System.Net.Security.SslPolicyErrors.None;

        };

        return handler;

#elif IOS

        var handler = new NSUrlSessionHandler

        {

            TrustOverrideForUrl = IsHttpsLocalhost

        };

        return handler;

#else

     throw new PlatformNotSupportedException("Only Android and iOS supported.");

#endif

    }

#if IOS

    public bool IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust trust)

    {

        if (url.StartsWith("https://localhost"))

            return true;

        return false;

    }

#endif

}

·       定義描述呼叫部署機器學習模型的Web API服務傳回的執行結果的類別

請參考[AI時代的網站與手機App建置與開發Part14 - 使用ML.NET建立推薦系統]這篇文件提到由ML.NET程式庫產生的MLModel.consumption.cs檔案中的ModelOutput類別, 為專案加入以下的ModelOutput類別, 請注意不可以直接使用ML.NET程式庫生成的ModelOutput類別, 您必須將原先ModelOutput類別中的所有的屬性的第一個英文字元由原先的大寫英文字變更成小寫的英文字元, 例如將原有名稱為UserId的屬性的名稱變更成userId, 將原有名稱為MovieId的屬性的名稱變更成movieId, 以此類推, 編輯妥的ModelOutput類別如下:

public class ModelOutput

{

    public float userId { get; set; }

    public float movieId { get; set; }

    public float rating { get; set; }

    public float score { get; set; }

}

·       製作手機App預測電影評論分數的使用者介面

編輯MAUI手機App專案根目錄下的MainPage.xaml檔案, <ScrollView>的內容編輯成以下的樣子, 負責定義預測電影評論分數的使用者介面:

<ScrollView>

    <VerticalStackLayout Padding="30,0"Spacing="25">

         <Label Text="User Id:" />

            <Entry x:Name="UserId" Text="1"></Entry>

            <Label Text="Movie Id:" />

            <Entry x:Name="MovieId" Text="3"></Entry>

            <Button x:Name="BtnPredict" Text="預測" Clicked="OnPredictClicked" 

HorizontalOptions="Fill" />

    </VerticalStackLayout>

</ScrollView>

·       處理手機App使用者按下輸入電影評論相關資訊表單下方的[預測]按鍵的事件

請為MainPage.xaml.cs類別加入以下的OnPredictClicked函式, 負責發送HTTP呼叫至Web API提供的機器學習服務(請注意在Android模擬器執行的手機程式必須使用10.0.2.2 IP位址呼叫佈署在本機電腦的Web API服務), 傳入股價的相關資料, 以預測股票價格結果:

private async void OnPredictClicked(object sender, EventArgs e)

{

    //請注意下列的57603為佈署在本機電腦的Web API服務使用的連接埠

    string BaseAddress = DeviceInfo.Platform == DevicePlatform.Android

                    ? "https://10.0.2.2: 57603" : "https://localhost: 57603";

//叫用佈署在本機電腦的Web API服務時請利用HttpsClientHandlerService建立HttpClient類別的物件

#if DEBUG

    HttpsClientHandlerService handler = new HttpsClientHandlerService();

    HttpClient Client = new HttpClient(handler.GetPlatformMessageHandler());

#else

    HttpClient Client = new HttpClient();

#endif

    object data = new  //建立描述欲預測電影評論分數的電影與使用者的相關資料

    {

        UserId = UserId.Text,

        MovieId = MovieId.Text,

    };

    string Uri = $"{BaseAddress}/predict";                  //欲呼叫的Web API的端點

    string strContent = JsonSerializer.Serialize(data);

    var content = new StringContent(strContent, Encoding.UTF8, "application/json");

    HttpResponseMessage Response = await Client.PostAsync(Uri, content);//發送呼叫

    Response.EnsureSuccessStatusCode();

    string Json = await Response.Content.ReadAsStringAsync();     //讀取呼叫的結果

    var Result = JsonSerializer.Deserialize<ModelOutput>(Json);

    float score = Result.score;                            //取得預測的電影評論分數

    await DisplayAlert(

"預測電影評論分數", $"{Score:N2}", "關閉"); //顯示預測的電影評論分數

}

·       執行手機App並送出電影與使用者相關資料以獲取預測的電影評論分數

請於Visual Studio開發工具中使用F5功能鍵以DEBUG模式執行手機App專案, 因為我們的程式會於DEBUG模式利用HttpsClientHandlerService類別建立呼叫位於本機電腦的Web API服務的HttpClient類別物件, 請注意手機App欲呼叫的Web API服務必須預先啟動, 叫用Web API服務的功能才會成功. 2所示即為手機App呼叫佈署機器學習模型的Web API服務的畫面:

2: 使用手機App提交電影與使用者相關資料以獲取預測的電影評論分數的畫面



留言

這個網誌中的熱門文章

AI時代的網站與手機App建置與開發Part27 - ML.NET與物件偵測

AI時代的網站與手機App建置與開發Part28 - 使用YOLO模型進行物件偵測

AI時代的網站與手機App建置與開發Part24 - ML.NET與圖片異常偵測