玩转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吧!
- 玩转Pachube (二) 更新数据
- 玩转Pachube (一) 创建一个Feed
- 玩转千万级别的数据(二)
- 玩转postman(二)
- SQL(二)数据更新
- 玩转Hibernate(二)实例解析
- 玩转php数组(二)
- 玩转php数组(二)
- 玩转ptrace(二)
- 玩转swift(二)
- 玩转ptrace(二)
- 用Python玩数据-笔记二
- Android热更新(1)-玩转TinkerDemo
- 玩转Web之Json(二)----jquery easy ui + Ajax +Json+SQL实现前后台数据交互
- myBatils学习二更新数据
- 二十一.数据的更新
- 【转】玩转ptrace(二)
- 玩转ptrace(二) [转]
- TCP IP状态变化
- 在winform中利用外部程序打开pdf或者word等文件的方法
- Activity生命周期
- WeakHashMap
- DSP firmware
- 玩转Pachube (二) 更新数据
- Uniform Grid , KD-Tree , BVH 性能比较
- Silverlight不响应鼠标实现拖动效果
- ConcurrentSkipListMap
- 换一个地方也许国产WPS OFFICE 会重夺办公软件霸主!
- 关于在scratchbox中使用root账户登录
- Setup vsftpd service
- Windows编程基础 - 概述
- ArcGIS for Silverlight在地图上随机显示图片