Daten von Windows 10 an Web-API senden.
Dieses Code-Beispiel zeigt, wie man Daten von einem lokalen Windows 10 Client an einen Webserver Asp.Net Core Web-Api anfügt
Dabei sendet eine lokale Windows 10 UWP Anwendung Daten als Json-Format an die Web-Api Schnittstelle des Webservers. Dort werden die Daten in die SQL-Datenbank angefügt
Gezeigt wird die HttpPost Methode zum Erstellen von neuen Daten.
Funktionsweise:
Der Client macht folgendes:
Daten aus SQlite lokaler Datenbank laden und in Json übertragen. Dann mit einem HttpClient und HttpPost senden an den Web-Server
Der Server macht folgendes:
Unter der HttpPost Methode übernimmt er die Anfrage und lädt die Daten aus dem Request-Body. Die Daten werden aus Json in einen Datensatz übertragen und gespeichert.
Beispiel Code
Code in C#
Client = UWP App Anwendung in Windows 10
Server=Asp.Net Core MVC Api
Json, HttpPut, REST, Web-Api, Sqlite und SQL-Server
API Client
UWP Client
SQLite, Json
HttpClient client = await Create_HttpClient_with_UserToken(); string IDDetail = "123abc"; //< read webApi > //*httpPut /api/projects string sUrl_Api_Create = app_settings._Api_Server + "/api/projects"; HttpResponseMessage httpResponseMessage = null; try { //< create Upload_Content > JsonObject jsonObject = new JsonObject(); jsonObject["IDDetail"] = JsonValue.CreateStringValue(IDDetail); jsonObject["Title"] = JsonValue.CreateStringValue("this is a Title"); StringContent string_to_Upload_Content = new StringContent(jsonObject.Stringify()); //</ create Upload_Content >
//< upload > //httpPost=Create httpResponseMessage = await client.PostAsync(sUrl_Api_Create, string_to_Upload_Content ); //</ upload > ..
|
Screenshot beim Senden der Daten
Zeigt: die Daten sind von der SQLite Datenbank in den Json Object eingefügt und werden gesendet
Web-Server
Asp.Net Core Web-API
//HttpPost URL=/api/projects //*Post=Create, Put=Update [HttpPost] public async Task<ActionResult> Create() { //-------------< Create() >------------- .. //--< Read UploadData >-- StreamReader reader = new StreamReader(Request.Body); JObject jsonData = JObject.Parse(reader.ReadToEnd()); string IDDetail = jsonData.GetValue("IDDetail").ToString(); string sTitle = jsonData.GetValue("Title").ToString(); //--</ Read UploadData >--
//< Create Data > ProjectModel project = new ProjectModel();
project.IDOwner = IDCurrent_User; project.Title = sTitle; project.DtCreated = DateTime.Now;
//</ Create Data >
//< add recordset > _dbContext.tbl_Projects.Add(project); await _dbContext.SaveChangesAsync(true); //</ add recordset >
//< out > //*output to client return Ok(); //</ out > //-------------</ Create() >------------- } |
ScreenShot auf dem Webserver Webapi beim ankommen der Daten.
Das Screenshot des Debuggers zeigt, dass die daten aus dem Request.Body in ein Json-Object entnommen gelesen werden und dort per Key-Pair entnommen werden können
Kompletter Code
Beispiel, C#
Kompletter Code der Sende-Methode in UWP
private async Task<bool> Api_Add_Projects() { //--------< Api_Add_Projects() >-------- if (optStop.IsChecked == true) return false; fx_Log("--< API:Api_Add_Projects >--");
//---------------< read_API_Data() >---------------
HttpClient client = await Create_HttpClient_with_UserToken();
//----< Check_to_local >---- //< find record > string sSQL = "SELECT * FROM tbl_Details WHERE [IDProject_on_Server] IS NULL"; SqliteDataReader dataReader = clsDB.Get_DataReader(sSQL); if (dataReader.HasRows == true) { while (dataReader.Read()) { //---< NoMatch: Delete on Server >--- string IDDetail = dataReader["IDDetail"].ToString(); fx_Log("add Project IDDetail:" + IDDetail); //</ nomatch >
//< read webApi > //*httpPut /api/projects string sUrl_Api_Create = app_settings._Api_Server + "/api/projects"; HttpResponseMessage httpResponseMessage = null; try { //< create Upload_Content > JsonObject jsonObject = new JsonObject(); jsonObject["IDDetail"] = JsonValue.CreateStringValue(IDDetail); jsonObject["Title"] = JsonValue.CreateStringValue("this is a Title"); StringContent string_to_Upload_Content = new StringContent(jsonObject.Stringify()); //</ create Upload_Content >
//< upload > //httpPost=Create httpResponseMessage = await client.PostAsync(sUrl_Api_Create, string_to_Upload_Content ); //</ upload >
//< result > var NewID = httpResponseMessage.Content.ToString(); //</ result >
fx_Log("ok.Created "); } catch (Exception ex) {
fx_Log("Error Delete byWebsite: " + ex.Message); //return; } //</ read webApi > //---</ NoMatch: Delete on Server >--- } }
//----</ @Loop: Projects_on_Server >---- //----</ get Projects-List >---- //---------------</ read_API_Data() >---------------
fx_Log("--</ API:Api_Add_Projects >--"); fx_Log("");
return true;
//--------</ Api_Add_Projects() >-------- } |
Kompletter Code der Web-API Schnittstelle auf der Server
//HttpPost URL=/api/projects //*Post=Create, Put=Update [HttpPost] public async Task<ActionResult> Create() { //-------------< Create() >------------- //< get UserClaim Info > //*get User from Token var userClaim_in_Token = HttpContext.User.Claims.Where(c => c.Type == ClaimsIdentity.DefaultNameClaimType).FirstOrDefault(); //User as Name if (userClaim_in_Token == null) { return null; } string sEmail = userClaim_in_Token.Value; //</ get UserClaim Info >
//< check user > long IDCurrent_User = await Get_UserID(sEmail); //</ check user >
//--< Read UploadData >-- StreamReader reader = new StreamReader(Request.Body); JObject jsonData = JObject.Parse(reader.ReadToEnd()); string IDDetail = jsonData.GetValue("IDDetail").ToString(); string sTitle = jsonData.GetValue("Title").ToString(); //--</ Read UploadData >--
//< Create Data > ProjectModel project = new ProjectModel();
project.IDOwner = IDCurrent_User; project.Title = sTitle; project.DtCreated = DateTime.Now; //</ Create Data >
//< add recordset > _dbContext.tbl_Projects.Add(project); //</ add recordset >
//< save sqlserver > await _dbContext.SaveChangesAsync(true); //</ save sqlserver >
//< out > //*output to client return Ok(); //</ out > //-------------</ Create() >------------- } |