RESTful学习笔记

前两天无意中知道了RESTful这个东西,网上搜了些相关的资料,比如这里

理解RESTful架构

和 这里

视频: RESTful Web Services- NetBeans IDE 6.5

越来越觉得这个东西挺有趣的。

刚接触WEB开发没多久,说的不对的地方,欢迎批评指正,在此先谢谢啦。


本人在完美方面有时会有些偏执狂,REST恰恰在某方面满足了我这方面的胃口:
简单 - 所有的操作都是客户端向服务端请求操作某种资源,很容易学习。

易用 - 一般来说,客户端仅仅通过四个HTTP动词(HEAD, GET, PUT, DELETE)就能完成所有操作。

规范 - 资源名称用名词(非强制、但强烈推荐,所以一般也都如此设计),操作用动词。

安全 - REST推荐使用HTTPS协议,当然HTTP也是木有问题的。

对程序员友好 - 服务端只要做的足够友好,只需要很少的文档,甚至无需文档,当然了这点仰仗设计师的水平了。如访问 https://api.github.com/ 会得到一个所有可用API的网址列表。

跨平台,跨语言 - 只要支持HTTPS、HTTP通讯、读写XML/JSON的编程语言(时至如今,几乎都支持喽),均没问题。

灵活,易于扩展 - 使用XML/JSON传输数据。另外REST有3个成熟度等级,这让我想到了管理课程的CMMI的5个等级。它是一套设计风格,而非架构,是否遵守、如何遵守,全屏个人感觉和意愿,你完全可以根据自己的情况定制。


当然了,我还想到了REST的一些缺点:

新鲜事物(当然对我来说很新鲜了,刚见面几天),支持的站点少,但有github等开源社区和Sun等大厂商推动,这点不是问题,况且还有NetBeans这样利于部署REST的工具。

由于通讯过程的无状态(这点应该是基于HTTP无法避免的缺陷),稳定性有点打折扣,另外会导致每次通讯过程数据的冗余。当然可以在架构设计时,努力减轻这种影响,比如客户端的多次输入合并为一次向服务端的REST请求。

基于HTTPS协议,时效性方面当然要差一些,很难以此为基础开发即时通等产品喽。当然,这也不是REST设计的初衷。


凑个热闹,试着写个用REST的API获取深圳天气情况的小Demo:

这里 World Weather Online 找到了开源的API,但必须先注册一下,然后申请一个“Free-Weather-API Key”,才可以使用。我申请到的Key是:689ab058717194e693b1fc1012fdb857d6874547

(之前尝试用 https://code.google.com/p/weather-china/wiki/API 的API,无需注册即可用,但无奈被伟大的GFW屏蔽,国内用户无法直接访问,所以退而求其次了)


HTML的代码





jQuery跨域调用REST天气预报API





使用REST获取World Weather Online上深圳的天气

正在获取深圳的天气情况,请稍等……

C#的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Xml;

namespace RESTTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();

            // Create the web request
            HttpWebRequest request = WebRequest.Create("http://api.worldweatheronline.com/free/v1/weather.ashx?q=Shenzhen&format=XML&num_of_days=5&key=689ab058717194e693b1fc1012fdb857d6874547") as HttpWebRequest;

            // Get response
            try
            {
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;

                //判断HTTP响应状态 
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    label1.Text = "资源访问失败!";
                    response.Close();
                    return;
                }
                // Get the response stream
                StreamReader reader = new StreamReader(response.GetResponseStream());
                StringReader str = new StringReader(reader.ReadToEnd());

                doc.Load(str);
            }
            catch (System.Exception ex)
            {
                label1.Text = ex.ToString();
            }
            
            string labelText = "";

            XmlNodeList xmlNodes = doc.SelectNodes("data/weather");
            foreach (XmlNode weatherNode in xmlNodes)
            {
                string date = "";
                string tempMaxC = "";
                string tempMinC = "";
                string weatherDesc = "";

                foreach (XmlNode item in weatherNode.ChildNodes)
                {
                    switch (item.Name)
                    {
                        case "date":
                            date = item.InnerText;
                            break;
                        case "tempMaxC":
                            tempMaxC = item.InnerText;
                            break;
                        case "tempMinC":
                            tempMinC = item.InnerText;
                            break;
                        case "weatherDesc":
                            weatherDesc = item.InnerText;
                            break;
                        default:
                            break;
                    }
                }

                labelText += "日期:" + date + "  天气:" + weatherDesc + "\n";
                labelText += "最低温度:" + tempMinC + "  最高温度:" + tempMaxC + "\n\n";
            }

            label1.Text = labelText;
        }
    }
}


代码打包上传到了CSDN下载,有兴趣的朋友请猛戳这里:http://download.csdn.net/detail/genfeng/7506057

你可能感兴趣的:(InternetDev)