ASP.NET Web API實現POST報文的構造與推送

畢設和OAuth協議相關,而要理解OAuth協議就必須理解HTTP GET/POST方法。所以研究了一下如何使用Web API或MVC構造POST報文並實現客戶端與服務器端的交互。服務器

我使用的工具是Visual Studio 2013 + Web API 2 + MVC 5。架構

在兩個不一樣的VS2013實例中分別新建兩個Web項目,都選擇空模板,其中一個命名爲Client,採用MVC架構,另外一個命名爲Server,採用Web API架構。併發

這裏須要兩個不一樣的VS2013實例是爲了能使兩個IIS Express服務在同一臺機器上同時運行。app

咱們先來看看客戶端:工具

因爲只是個Demo,所以咱們只在客戶端中新建一個空的MVC控制器,將其命名爲HomeController。它會自帶一個Index()方法。咱們在這裏面寫好構造請求併發送請求的代碼:學習

namespace Client.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            string url = ""; // 這裏咱們還不知道服務器的url,所以留空
            
            #region 構造POST請求
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.Host = "localhost:14340";
            string body = "client_id=123&redirect_uri="+url+"&response_type=code";
            byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bodyBytes,0,bodyBytes.Length);
            #endregion

            #region 發送請求並取得響應
            // 必須使用HttpWebRequest.GetResponse()方法,請求才能被髮送並取得響應
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            StreamReader sr = new StreamReader(response.GetResponseStream());
            ViewBag.Response = sr.ReadToEnd();
            #endregion

            return View();
        }
    }
}

接下來咱們構造服務器端:url

在Server項目中,新建一個Web API 2控制器。命名隨意(我這裏命名爲ApiTestController),在控制器中寫入一個方法Post,返回HttpResponseMessage類型。spa

原本我一直覺得POST的參數能夠在Request屬性中獲取,可是仔細檢查了Request屬性的全部屬性和方法,包括擴展方法,都沒有找到能夠直接讀取POST報文請求體的屬性或方法。查閱資料得知,若是要在POST請求中獲取請求體的內容,就必須將參數封裝在一個類中。因而咱們創建一個類RequestArgs以下:調試

namespace Server.Models
{
    /// <summary>
    /// 對於POST請求,必須對請求體的全部參數創建一個模型類。
    /// </summary>
    public class RequestArgs
    {
        public string client_id { get; set; }
        public string redirect_uri { get; set; }
        public string response_type { get; set; }
    }
}

這裏的參數和上文客戶端Action方法中的請求報文內容必須保持名稱一致(包括大小寫)code

以後咱們再寫入控制器的POST方法以下:

namespace Server.Controllers
{
    public class ApiTestController : ApiController
    {
        public HttpResponseMessage Post(RequestArgs args)
        {
            string client_id = args.client_id;
            string redirect_uri = args.redirect_uri;
            string response_type = args.response_type;
            return Request.CreateResponse(HttpStatusCode.OK, "I have received your message. Client_id = "+client_id+", RedirectUri = "+redirect_uri+"response_type = "+response_type);
        }
    }
}

這裏咱們直接返回了報文的內容,而在實際的項目中,咱們能夠本身對傳入的參數進行處理。

以後咱們編譯運行服務器端(最好是按F5進入調試模式運行)。能夠看到出現的Web頁面彷佛是一個錯誤頁面,可是不用管它,咱們的服務器已經開始運行了。

記下服務器的地址(通常也就是端口號會變化),將這個服務器的地址填入客戶端的url變量。

編譯運行客戶端,若是出現返回的信息(這裏是「I have received your message」和參數信息),說明咱們的請求成功了。

補充說明:若是在Request.CreateResponse()方法中傳入實體對象的話,默認是轉換成JSON傳遞,固然能夠在WebApiConfig.cs中修改返回結果的方式。

筆者撰寫此文的目的一是爲之後畢設的繼續進行而研究,二也是對MVC和Web API學習的一個記錄。

敬請指正!

相關文章
相關標籤/搜索