初級Web API+MySql獲取資料
阿新 • • 發佈:2019-02-07
它是一個傳統的 ASP.NET MVC 控制器。它只是負責處理站點的HTML頁,跟Web API沒有直接關係。
手動新增一個API控制器
選擇包含空讀/寫操作的API控制器,然後新增。
新增完後可看到空白的控制器程式碼,然後根據需要補充邏輯需求。
例:
using MFirstWAPI.Models;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
using System.Web.Script.Serialization;
namespace MFirstWAPI.Controllers
{
public class UsersController : ApiController
{
// GET api/values
public IEnumerable<Users> Get()
{
List<Users> listUser = new List<Users>();
MySqlConnection mysql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from user",mysql);
mysql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
Users user = new Users();
user.UserID = reader.GetInt32("ID");
user.UserName = reader.GetString("username");
user.UserEmail = reader.GetString("useremail");
listUser.Add(user);
}
}
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
mysql.Close();
}
return listUser;
}
// GET api/Users/5
public Users GetUserByID(int id)
{
Users user = new Users();
MySqlConnection mysql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from USER where ID=" + id, mysql);
mysql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
user.UserID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.UserEmail = reader.GetString(2);
}
}
reader.Close();
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
reader.Close();
}
return user;
}
//GET api/Users/?username=xx
public IEnumerable<Users> GetUserByName(string userName)
{
List<Users> listuser = new List<Users>();
MySqlConnection msql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from USER where username like'%" + userName+"%'",msql);
msql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
Users user = new Users();
user.UserID = reader.GetInt32("ID");
user.UserName = reader.GetString("USERNAME");
user.UserEmail = reader.GetString("USEREMAIL");
listuser.Add(user);
}
}
reader.Close();
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
reader.Close();
}
return listuser;
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
private static MySqlConnection getMySqlConnection()
{
MySqlConnection mysql = new MySqlConnection(ConfigurationManager.ConnectionStrings["MySqlConnection"].ConnectionString);
return mysql;
}
public static MySqlCommand getSqlCommand(String sql, MySqlConnection mysql)
{
MySqlCommand mySqlCommand = new MySqlCommand(sql, mysql);
return mySqlCommand;
}
}
}
此處程式碼,主要補充了Get方法的邏輯。資料從mysql資料庫中獲取。例中MySql對應user表中資料如下
獲取資料共寫了三個get方法,第一個是獲取所有user資料,
第二個根據Users 的ID獲取對應Users,第三個根據UserName獲取Users。為了能夠通過MySql獲取資料,需要在Web.config的<connectionStrings>節點中新增
<add name="" providerName="System.Data.SqlClient" connectionString=""/>
name為connectionString對應名稱,connectionString中為連線mysql的配置
程式碼中通過ConfigurationManager.ConnectionStrings["name"].ConnectionString獲取mysql配置。
完成程式碼編寫後,即可對進行程式碼測試。如果需要部署到IIS,則需要釋出網站,然後配置IIS,需要注意的是IIS應用程式池需要
.net FramWork版本為4.0。否則部署不成功。
Chorm通過 IIS獲取資料如下:
四、修改返回資料JSON非XML
如果不修改返回資料型別,chrome中預設返回的資料並不是以上圖片所示資料格式,而是XML型別,IE下返回的資料位JSON格式。
那麼如何修改只返回JSON而遮蔽掉,百度後會有很多例項,本例使用的是通過使用自定義的只返回Json Result的content negotiation代替Web Api中預設的content negotiation。Conneg通過實現IContentNegotiator的Negotiator方法實現擴充套件。Negotiator方法返回ContentNegotiationResult(它包裝了你選擇的headers和formatter)。
下面的方法通過傳遞一個JsonMediaTypeFormatter給自定義的conneg negotiator,讓它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。這種方法避免了每次請求都要重新建立一次formatter。 方法如下:
下面的方法通過傳遞一個JsonMediaTypeFormatter給自定義的conneg negotiator,讓它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。這種方法避免了每次請求都要重新建立一次formatter。 方法如下:
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}
然後接下來,需要在HttpConfiguration例項上註冊新的實現機制,在App_Start下找到WebApiConfig.cs新增程式碼,新增完後代碼如下 public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); var jsonFormatter = new JsonMediaTypeFormatter(); config.Services.Replace(typeof(IContentNegotiator), new MFirstWAPI.Controllers.UsersController.JsonContentNegotiator(jsonFormatter)); } } 紅色部分為新加程式碼 最後編譯釋出,通過Chrome瀏覽器獲取資料為JSON格式了。