玩转Pachube (二) 更新数据

来源:互联网 发布:淘宝能否货到付款 编辑:程序博客网 时间:2024/05/24 02:12

将最新的数据更新到Pachube有两种方法:手动和API。


手动方式更新数据非常简单:

首先,用你的帐号登录Pachube网站。

第二,从My Feeds里面找到自己要更新数据的Feed和Datastream(数据流)。

第三,在Data Stream右上角的输入框内输入要更新的数据,点击旁边的磁盘图标(保存按钮),手动数据更新就完成了。



下面,我要着重介绍使用API方式来更新数据的方法。

开始之前,我罗嗦一句,Pachube提供了功能非常丰富的API供编程者调用,具体请参考Pachube网站上API在线文档:http://api.pachube.com/v2/

更新数据用到的是 Update Datapoint这个API。简单来说,通过HTTP的PUT方法,将数据更新到pachube网站上。有一个要点,在HTTP Header即HTTP头信息里面,必须包含一个具有PUT权限的key,否则API调用将不能成功。这相当于是访问控制,没有key的人就无法更新你的数据。那么这个Key是如何而来的呢?


一、API Key的产生

首先点击右侧菜单的My Keys项,如下:


然后点击右下角的Create a new API Key,即“创建一个新的API Key”:


在创建Key的窗口内勾选自己想要的权限,例如,我需要一个可以更新数据的Key,那么就选PUT方法:


在创建Key的时候,还可以指定域、限制请求IP地址、指定是否能访问私人Feed和这个Key的有效期。这些不是必填项目,但是填了可以增加系统的安全性,当然也可能带来额外的问题。我这里就都不填了,留为空即可。点击Create New API Key按钮,一个新的API Key就创建完成了。如下:


点击Show Key 即可显示出新创建好的Key来。要删除一个Key的话,点击旁边的Delete就可以。

创建好的有PUT权限的key我们先copy下来,备用。至此,我们的Key就创建好了。


二、API URL

通过读Pachube的API文档,我发现他们给出的URL总是有问题。经过自己的摸索,我发现下面这个URL既简单又稳定,各位看好了:

http://api.pachube.com/v2/feeds/<FeedID>.csv 

那么这个FeedID又是怎么找出来的呢?这个FeedID就是你的feed的URL最后的数字部分,例如我家的环境数据的Feed的ID就是39255。




那么等会调用API的URL就是 http://api.pachube.com/v2/feeds/39255.csv ,这下大家明白了吧?

而HTTP的请求里面的数据是一个非常简单的string,内容为: "<datastream ID>, <value>"。也就是数据流ID和要更新的值用逗号隔开即可。例如:要把001这个datastream的值更新为15.9,那么PUT请求时发送的字符串内容就是 "001,15.9"。

下面是我的工具类里面的一个发送Pachube HTTP请求的方法:

public static string PachubeHttpRequest( string url, string method, string postContent ){if ( !_isInitialized ){throw new ApplicationException( "NetUtil has NOT been initialized yet while HttpPost method is called." );}string result = string.Empty;try{// Create a request using a URL that can receive a post. HttpWebRequest request = (HttpWebRequest) WebRequest.Create( url );// Set the Method property of the request to POST.request.Method = method;// set timeout for the requestrequest.Timeout = _timeOut;// set proxy if necessaryif ( _needProxy ){request.Proxy = _myProxy;}request.Headers[ "X-PachubeApiKey" ] = "前面生成的的API Key放这里";if ( !string.IsNullOrEmpty( postContent ) ){// Create POST data and convert it to a byte array.byte[] byteArray = Encoding.UTF8.GetBytes( postContent );// Set the ContentType property of the WebRequest.request.ContentType = "application/x-www-form-urlencoded";// Set the ContentLength property of the WebRequest.request.ContentLength = byteArray.Length;// Get the request stream.using( Stream dataStream = request.GetRequestStream() ){dataStream.Write( byteArray, 0, byteArray.Length );}}// Get the response.using ( HttpWebResponse response = (HttpWebResponse) request.GetResponse() ){if ( response.StatusCode == HttpStatusCode.OK ){Encoding encode = Encoding.UTF8;// Get the stream containing content returned by the server.using ( Stream responseStream = response.GetResponseStream() ){if ( responseStream != null ){using ( StreamReader reader = new StreamReader( responseStream, encode ) ){result = reader.ReadToEnd();}}}}}}catch ( Exception ){}return result;}    


假设上面的代码放在一个叫NetUtil的类里面,它的初始化部分如下:

        /// <summary>        /// Initializes net utilities        /// </summary>        /// <param name="timeOut">每次POST时等待的时间(毫秒),如果超过这个时间被检测服务器仍然没有响应,则超时</param>        /// <param name="proxyServerAddress">代理服务器地址。例如,"proxy.abc.com",如果不需要代理服务器,则设置为空或null</param>        /// <param name="proxyServerPort">代理服务器端口。例如,8080</param>        /// <param name="proxyUserName">代理服务器访问用户名。如果代理服务器不需要用户认证,则设置为空或null</param>        /// <param name="proxyPassword">代理服务器访问密码。如果代理服务器不需要用户认证,则设置为空或null</param>        public static void Initialize(            int timeOut, string proxyServerAddress, int proxyServerPort, string proxyUserName, string proxyPassword )        {            // initialize proxy            InitProxy( proxyServerAddress, proxyServerPort, proxyUserName, proxyPassword );            // initialize other network parameter            _timeOut = timeOut;            _isInitialized = true;        }        /// <summary>        /// initialize proxy        /// </summary>        private static void InitProxy(            string proxyServerAddress, int proxyServerPort, string proxyUserName, string proxyPassword )        {            string proxyAddr = proxyServerAddress;            _needProxy = !string.IsNullOrEmpty( proxyAddr );            if( _needProxy )            {                int proxyPort = proxyServerPort;                _myProxy = new WebProxy( proxyAddr, proxyPort );                string proxyUser = proxyUserName;                if( !string.IsNullOrEmpty( proxyUser ) )                {                    NetworkCredential credential = new NetworkCredential( proxyUser, proxyPassword );                    _myProxy.Credentials = credential;                }                else                {                    _myProxy.Credentials = CredentialCache.DefaultCredentials;                }            }        }


以上工具类的调用非常简单,例如要把39255这个Feed中ID为003的datastream的当前值更新为12.5,代码片段如下:

NetUtil.PachubeHttpRequest( "http://api.pachube.com/v2/feeds/39255.csv", "PUT", "003,12.5");

终于完成了。马上去试试更新你的Pachube吧!








原创粉丝点击