Получить данные из базы данных MySQL в WebApi To HttpRecquest? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь получить набор данных из базы данных MySQL в приложении WebAPI и получить к нему доступ через HTTP-запрос от мобильного приложения.Поэтому я создал WebApi, класс RestClient и класс, в котором я буду показывать данные, это мой код.

Web API

[Produces("application/json")]
[Route("api/Blog")]
public class BlogController : Controller
{
    // GET: api/Blog
    [HttpGet]
    public  IEnumerable<string>  Get()
    {

    }

    // GET: api/Blog/5
    [HttpGet("{id}", Name = "GetBlogItems")]
    public string Get(int id)
    {

    }

    // POST: api/Blog
    [HttpPost]
    public void Post([FromBody]  RetrieveDataClass value)
    {
        string sqlstring = "server=; port= ; user id =;Password=;Database=;";
        MySqlConnection conn = new MySqlConnection(sqlstring);
        try
        {
            conn.Open();
        }
        catch (MySqlException ex)
        {
            throw ex;
        }
        string Query = "INSERT INTO test.blogtable (id,Telephone,CreatedSaved,Topic,Summary,Category,Body1,Body2,Body3,Body4)values('" + value.TopicSaved1 + "','" + Value.Telephone + "','" + Value.Created/Saved + "','" + value.TopicSaved1 + "','" +value.SummarySaved1 +"','" +value.CategoriesSaved1 +"','" +value.Body1 +"','" +value.Body2 +"','" +value.Body3 +"','" +value.Body4 +"');";
        MySqlCommand cmd = new MySqlCommand(Query, conn);
        cmd.ExecuteReader();
        conn.Close();

    }

    // PUT: api/Blog/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE: api/ApiWithActions/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}

Итак, вВ моей базе данных три строки с номером телефона +233892929292, после фильтра мне нужно получить три строки.и я бы также отфильтровал только столбец темы и резюме.

Класс RestClient

   public class BlogRestClient<T>
{
    private const string WebServiceUrl = "http://localhost:57645/api/Blog/";

    public async Task<List<T>> GetAsync()
    {

        var httpClient = new HttpClient();

        var json = await httpClient.GetStringAsync(WebServiceUrl);

        var taskModels = JsonConvert.DeserializeObject<List<T>>(json);

        return taskModels;
    }


    public async Task<bool> PostAsync(T t)
    {

        var httpClient = new HttpClient();

        var json = JsonConvert.SerializeObject(t);

        HttpContent httpContent = new StringContent(json);

        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var result = await httpClient.PostAsync(WebServiceUrl, httpContent);

        return result.IsSuccessStatusCode;

    }

    public async Task<bool> PutAsync(int id, T t)
    {
        var httpClient = new HttpClient();

        var json = JsonConvert.SerializeObject(t);

        HttpContent httpContent = new StringContent(json);

        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var result = await httpClient.PutAsync(WebServiceUrl + id, httpContent);

        return result.IsSuccessStatusCode;
    }

    public async Task<bool> DeleteAsync(int id, T t)
    {
        var httpClient = new HttpClient();

        var response = await httpClient.DeleteAsync(WebServiceUrl + id);

        return response.IsSuccessStatusCode;
    }
}

ModelData Class

    public class ModelDataClass
    {
         public string Telephone ;
         public string Created/Saved ;
         public string TopicSaved1 ;
         public string SummarySaved1 ;
         public string CategoriesSaved1 ;
         public string Body1 ;
         public string Body2 ;
         public string Body3 ;
         public string Body4 ;


         public ModelDataClass()
         {

         }
    }

Значения для строк в ModelDataClass установлены в другом классе для публикации в базе данных MySQL.Так как это не вызывает проблему, я не включил код.

RetrieveDataClass

 public class RetrieveDataClass
    {
         public string Topic ;
         public string Summary ;

         public RetrieveDataClass()
         {
            GetDataEvent();
            AddBlog();
         }

          public void GetDataEvent()
         {
          BlogRestClient<ModelDataClass> restClient = new 
          BlogRestClient<ModelDataClass>();
            await restClient.GetAsync();
         }


      public ObservableCollection<ModelDataClass> BlogItems = new  
      ObservableCollection<ModelDataClass>();

    public void AddBlog()
    {
        BlogListView.ItemsSource = BlogItems;
    }
   }

Question1 Как получить данные из Mysql в WebAPI, доступ к которым осуществляется через клиентский класс REST (это длямобильный, поэтому я должен использовать запрос Http)?

Question2 Я хотел бы создать listView для каждой строки, которую я получаю через базу данных MySQL.С заголовком, являющимся данными в столбце темы, и подзаголовком с данными в столбце сводки.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

я решил проблему.

WebApi

[Produces("application/json")]
[Route("api/Blog")]
public class BlogController : Controller
{
// GET: api/Blog
[HttpGet]
 public List<BlogViews>  Get()
    {

            string sqlstring = "server=; port= ; user id =;Password=;Database=;";
            MySqlConnection conn = new MySqlConnection(sqlstring);
            try
            {
                conn.Open();
            }
            catch (MySqlException ex)
            {
                throw ex;
            }
            string Query = "SELECT * FROM test.blogtable where `Telephone` ='Created'";
            MySqlCommand cmd = new MySqlCommand(Query, conn);
            MySqlDataReader MSQLRD = cmd.ExecuteReader();
            List<BlogViews> GetBlogList = new List<BlogViews>();

            if (MSQLRD.HasRows)
            {

              while (MSQLRD.Read())
              {
                BlogViews BV = new BlogViews();
                BV.id = (MSQLRD["id"].ToString());
                BV.DisplayTopic = (MSQLRD["Topic"].ToString());
                BV.DisplayMain = (MSQLRD["Summary"].ToString());
                GetBlogList.Add(BV);
              }
            }
            conn.Close();
        return GetBlogList;
    }

// GET: api/Blog/5
[HttpGet("{id}", Name = "GetBlogItems")]
public string Get(int id)
{

}

// POST: api/Blog
[HttpPost]
public void Post([FromBody]  RetrieveDataClass value)
{
    string sqlstring = "server=; port= ; user id =;Password=;Database=;";
    MySqlConnection conn = new MySqlConnection(sqlstring);
    try
    {
        conn.Open();
    }
    catch (MySqlException ex)
    {
        throw ex;
    }
    string Query = "INSERT INTO test.blogtable (id,Telephone,CreatedSaved,Topic,Summary,Category,Body1,Body2,Body3,Body4)values('" + value.TopicSaved1 + "','" + Value.Telephone + "','" + Value.Created/Saved + "','" + value.TopicSaved1 + "','" +value.SummarySaved1 +"','" +value.CategoriesSaved1 +"','" +value.Body1 +"','" +value.Body2 +"','" +value.Body3 +"','" +value.Body4 +"');";
    MySqlCommand cmd = new MySqlCommand(Query, conn);
    cmd.ExecuteReader();
    conn.Close();

}

// PUT: api/Blog/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}

// DELETE: api/ApiWithActions/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}

}

RetriveDataClass

   public class RetrieveDataClass
   {

     public RetrieveDataClass()
     {
       AddBlog();
     }
  public class BlogViews
    {
        public string id { get; set; }
        public string DisplayTopic { get; set; }
        public string DisplayMain { get; set; }
        public ImageSource BlogImageSource { get; set; }
    }

    public List<BlogViews> BlogList1 = new List<BlogViews>();
    public async Task< List<BlogViews>> GetBlogs()
    {
        BlogRestClient<BlogViews> restClient = new BlogRestClient<BlogViews>();
        var BlogV = await restClient.GetAsync();
        return BlogV;
    }

    public async void AddBlog()
    {
        BlogList1 = await GetBlogs();
        BlogListView.ItemsSource = BlogList1;
    }


}

так что теперь я получаю список, который содержит каждую строку из базы данных и каждый элемент в заголовке списка - DisplayTopic, а подзаголовок - DisplayMain.

0 голосов
/ 18 февраля 2019

Ваше приложение разработано с использованием шаблона Multitier Architecture .Таким образом, вы должны убедиться, что у вас есть разделение интересов.

Веб-API будет представлять логический уровень вашей презентации.Он будет анализировать запрос клиента, запрашивать данные по мере необходимости и форматировать возвращаемые данные по мере необходимости.

Затем RetrieveClient может обрабатывать уровень доступа к данным.Он будет управлять доступом к базе данных, вставлять, обновлять, удалять по мере необходимости.

Ключевым моментом здесь является обеспечение того, чтобы каждый слой общался с другим для выполнения действий и чтобы у вас не было прямого доступа к базе данных в вашемУровень представления.

Как таковой,

Как получить данные?

На вашем уровне доступа к данным:

public class RetrieveDataClass
{
    private IDbConnection connection;

    public RetrieveDataClass(System.Data.IDbConnection connection)
    {
        // Setup class variables
        this.connection = connection;
    }

    /// <summary>
    /// <para>Retrieves the given record from the database</para>
    /// </summary>
    /// <param name="id">The identifier for the record to retrieve</param>
    /// <returns></returns>
    public EventDataModel GetDataEvent(int id)
    {
        EventDataModel data = new EventDataModel();

        string sql = "SELECT id,Telephone,CreatedSaved,Topic,Summary,Category,Body1,Body2,Body3,Body4 WHERE id = @id";
        using (IDbCommand cmd = connection.CreateCommand())
        {
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;

            IDbDataParameter identity = cmd.CreateParameter();
            identity.ParameterName = "@id";
            identity.Value = id;
            identity.DbType = DbType.Int32; // TODO: Change to the matching type for id column

            cmd.Parameters.Add(identity);

            try
            {
                connection.Open();
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        data.id = reader.GetInt32(reader.GetOrdinal("id"));
                        // TODO : assign the rest of the properties to the object
                    }
                    else
                    {
                        // TODO : if method should return null when data is not found
                        data = null;
                    }
                }
                // TODO : Catch db exceptions
            } finally
            {
                // Ensure connection is always closed
                if (connection.State != ConnectionState.Closed) connection.Close();
            }
        }

        // TODO : Decide if you should return null, or empty object if target cannot be found.
        return data;
    }

    // TODO : Insert, Update, Delete methods
}

Выше будет получена записьиз базы данных и вернуть его как объект.Вместо этого вы можете использовать библиотеки ORM , такие как EntityFramework или NHibernate, но у них есть собственная кривая обучения.

Как вернуть данные?

Ваш клиент будет вызывать WebAPI,который, в свою очередь, запрашивает данные из уровня доступа к данным.

[Produces("application/json")]
[Route("api/Blog")]
public class BlogController : Controller
{
    // TODO : Move the connection string to configuration
    string sqlstring = "server=; port= ; user id =;Password=;Database=;";

    // GET: api/Blog
    /// <summary>
    /// <para>Retrieves the given record from the database</para>
    /// </summary>
    /// <param name="id">Identifier for the required record</param>
    /// <returns>JSON object with the data for the requested object</returns>
    [HttpGet]
    public IEnumerable<string> Get(int id)
    {
        IDbConnection dbConnection = System.Data.Common.DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
        RetrieveDataClass dal = new RetrieveDataClass(dbConnection);

        EventDataModel data = dal.GetDataEvent(id);
        if (data != null)
        {
            // Using Newtonsoft library to convert the object to JSON data
            string output = Newtonsoft.Json.JsonConvert.SerializeObject(data);

            // TODO : Not sure if you need IEnumerable<string> as return type
            return new List<string>() { output };
        } else
        {
            // TODO : handle a record not found - usually raises a 404
        }
    }

    // TODO : other methods
}

Есть много других примеров онлайн о том, как получить доступ к данным через API.Посмотрите на Google и обзор.Вот некоторые из них, которые приходят на ум:

https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.2&tabs=visual-studio

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

...