玩转Pachube (二) 更新数据

将最新的数据更新到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 request
				request.Timeout = _timeOut;

				// set proxy if necessary
				if ( _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吧!








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值