我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Twitter是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Twitter是什么

这篇文章主要讲解了“Twitter是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Twitter是什么”吧!

Twitter 迅速占领了 Internet 市场。您肯定知道这个出色的社交网络工具允许订阅者提供关于他们自身以及当前正在执行的任务的简要状态更新。追随者 将接收到他们的 “Twitter 提要” 的更新,这与博客将更新生成到博客阅读者的提要中极为类似。

就其本身而言,Twitter 是对社交网络的有趣讨论,并且是用户之间的新一代 “高度互联”,它具备您能想到的所有优点和缺点。

由于 Twitter 很早就发布了其 API,因此大量 Twitter 客户机应用程序涌入到 Internet 上。由于该 API 主要建立在直观和易于理解的基础上,因此许多开发人员都发现有必要构建一个自己的 Twitter 客户机,这与学习 Web 技术的开发人员构建自己的博客服务器极为类似。

考虑到 Scala 的功能性(这看上去能很好地协同 Twitter 的 REST 式特性)以及非常出众的 XML 处理特性,因此尝试构建一个用于访问 Twitter 的 Scala 客户机库应该是一个非常不错的体验。

何为 Twitter?

在详细讨论之前,我们先来看看 Twitter API。

简单来说,Twitter 是一个 “微型博客” — 关于您自己的简短个性化提要,不超过 140 个字符,任何 “追随者” 都可以通过 Web 更新、RSS、文本消息等方式接收它们。(140 字符的限制完全来自文本消息,它是 Twitter 的主要来源渠道,并受到类似的限制)。

最具 REST 特征 是什么意思?

一些读者会对我所使用的最具 REST 特征 短语感到好奇;这需要一些说明。“Twitter API 试图符合 Representational State Transfer (REST) 的设计原则”。并且在很大程度上说它做到了。该思想的创造者 Roy Fielding 可能不同意 Twitter 使用这个术语,但实现来说,Twitter 的方法将适合大多数人的 REST 定义。我只希望避免关于 REST 定义的激烈争论。因此,我使用了限定词 “最”。

从实际的角度来说,Twitter 是一个最具 REST 特征 的 API,您可以使用一些种类的消息格式 — XML、ATOM、RSS 或 JSON — 来发送或从 Twitter 服务器接收消息。不同的 URL,与不同的消息和它们所需及可选的消息部分相结合,可以发起不同的 API 调用。例如,如果您希望接收 Twitter 上所有人的所有 “Tweets”(Twitter 更新)的完整列表(也称作 “公共时间轴”),您需要准备一个 XML、ATOM、RSS 或 JSON 消息,将它发送给合适的 URL,并采用与 Twitter 网站(apiwiki.twitter.com)上相同的格式来使用结果:

------------------------------------------------------------

public_timeline

返回设定了自定义用户图标的

非保护用户的 20 条最新状态。不需要身份验证。

注意,公共时间轴将缓存 60 秒钟

因此频繁请求它不再浪费资源。

URL: http://twitter.com/statuses/public_timeline.format

格式:xml、json、rss、atom

方法:GET

API 限制:不适用

返回:状态元素列表

------------------------------------------------------------

从编程的角度来说,这意味着我们给 Twitter 服务器发送一个简单的 GET HTTP 请求,并且我们将获取一组封装在 XML、RSS、ATOM 或 JSON 消息中的 “状态” 消息。Twitter 站点将 “状态” 消息定义为类似清单 1 所示的内容:

清单 1. 您好世界,您在哪里?

< feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">   < title>Twitter / tedneward< /title>   < id>tag:twitter.com,2007:Status< /id>   < link type="text/html" rel="alternate" href="http://twitter.com/tedneward"/>   < updated>2009-03-07T13:48:31+00:00< /updated>   < subtitle>Twitter updates from Ted Neward / tedneward.< /subtitle>   < entry>  < title>tedneward: @kdellison Happens to the best of us...< /title>  < content type="html">tedneward: @kdellison Happens to the best of us...< /content>  < id>tag:twitter.com,2007:http://twitter.com/tedneward/statuses/1292396349< /id>  < published>2009-03-07T11:07:18+00:00< /published>  < updated>2009-03-07T11:07:18+00:00< /updated>  < link type="text/html" rel="alternate"         href="http://twitter.com/tedneward/statuses/1292396349"/>  < link type="image/png" rel="image"         href="http://s3.amazonaws.com/twitter_production/profile_images/           55857457/javapolis_normal.png"/>  < author>    < name>Ted Neward< /name>    < uri>http://www.tedneward.com< /uri>  < /author>   < /entry> < /feed>

状态消息中的大部分元素(如果不是全部的话)都很直观,因此不再赘述。

由于我们可以采用三种基于 XML 的格式使用 Twitter 消息,以及 Scala 具备一些非常强大的 XML 特性,包括 XML 字面值和类似 XPath 的查询语法 API,因此编写可以发送和接收 Twitter 消息的 Scala 库只需要一些基础的 Scala 编码工作。举例来说,通过 Scala 使用清单 1 消息来提取状态更新的标题或内容可以利用 Scala 的 XML 类型和 \ 及 \\ 方法,如 清单 2 所示:

清单 2. 您好 Ted,您在哪里?

< ![CDATA[  package com.tedneward.scitter.test  {    class ScitterTest    {      import org.junit._, Assert._            @Test def simpleAtomParse =      {        val atom =          < feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">           < title>Twitter / tedneward< /title>           < id>tag:twitter.com,2007:Status< /id>           < link type="text/html" rel="alternate" href="http://twitter.com/tedneward"/>           < updated>2009-03-07T13:48:31+00:00< /updated>           < subtitle>Twitter updates from Ted Neward / tedneward.< /subtitle>           < entry>             < title>tedneward: @kdellison Happens to the best of us...< /title>             < content type="html">tedneward: @kdellison                                   Happens to the best of us...< /content>             < id>tag:twitter.com,2007:                  http://twitter.com/tedneward/statuses/1292396349< /id>             < published>2009-03-07T11:07:18+00:00< /published>             < updated>2009-03-07T11:07:18+00:00< /updated>             < link type="text/html" rel="alternate"                   href="http://twitter.com/tedneward/statuses/1292396349"/>             < link type="image/png" rel="image"                   href="http://s3.amazonaws.com/twitter_production/profile_images/                          55857457/javapolis_normal.png"/>             < author>               < name>Ted Neward< /name>               < uri>http://www.tedneward.com< /uri>             < /author>           < /entry>         < /feed>             assertEquals(atom \\ "entry" \ "title",     "tedneward: @kdellison Happens to the best of us...")      }    }  }  ]]>

有关 Scala 的 XML 支持的更多详细信息,请参阅 “Scala 和 XML”。

实际上,使用原始 XML 本身并不是一个有趣的练习。如果 Scala 的宗旨是让我们的生活更加轻松,那么可以创建一个或一组专用于简化 Scala 消息发送和接收任务的类。作为其中一个目标,应该能够在 “普通” Java 程序中方便地使用库(这意味着可以方便地从任何可理解普通 Java 语义的环境中来访问它,比如说 Groovy 或 Clojure)。

API 设计

在深入了解 Scala/Twitter 库的 API 设计之前(根据同事 ThoughtWorker Neal Ford 的建议,我将它称作 “Scitter”),需要明确一些需求。

首先,Scitter 显然会对网络访问有一些依赖 — 并且可扩展到 Twitter 服务器 — 这会使测试变得非常困难。

其次,我们需要解析(和测试)Twitter 发回的各种格式。

第三,我们希望隐藏 API 内部各种格式之间的差异,以便客户机不需要担心已记录的 Twitter 消息格式,但是可以仅使用标准类。

最后,由于 Twitter 依赖 “通过身份验证的用户” 才能使用大量 API,因此 Scitter 库需要适应 “验证” 和 “未验证” API 之间的差异,而不会让事情变得过于复杂。

网络访问需要一些形式的 HTTP 通信,以便联系 Twitter 服务器。虽然我们可以使用 Java 库本身(特别是 URL 类及其同胞),但由于 Twitter API 需要大量请求和响应主体连接,因此可以更加轻松地使用不同的 HTTP API,特别是 Apache Commons HttpClient 库。为了更便于测试客户机 API,实际通信将隐藏在一些 API 内部的 Scitter 库中,以便能够更加轻松地切换到另一个 HTTP 库(其必要性不太容易想到),并能模拟实际网络通信以简化测试(其作用很容易想到)。

结果,第一个测试是 Scala 化 HttpClient 调用,以确保基本通信模式就位;注意,由于 HttpClient 依赖另外两个 Apache 库(Commons Logging 和 Commons Codec),因此还需要在运行时提供这些库;对于那些希望开发相似种类代码的读者,确保类路径中包括所有三个库。

由于最易于使用的 Twitter API 是测试 API

因此在请求格式中返回 “ok”,并附带 200 OK HTTP 状态码。

我们将使用它作为 Scitter 测试中的保留条款。它位于 URL http://twitter.com/help/test.format(其中,“format” 为 “xml” 或 “json”;至于目前,我们将选择使用 “xml”),并且仅有的支持 HTTP 方法是 GET。HttpClient 代码简明易懂,如清单 3 所示:

清单 3. Twitter PING!

package com.tedneward.scitter.test  {    class ExplorationTests    {      // ...          import org.apache.commons.httpclient._, methods._, params._, cookie._            @Test def callTwitterTest =      {        val testURL = "http://twitter.com/help/test.xml"               // HttpClient API 101        val client = new HttpClient()        val method = new GetMethod(testURL)         method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))         client.executeMethod(method)                val statusLine = method.getStatusLine()                assertEquals(statusLine.getStatusCode(), 200)        assertEquals(statusLine.getReasonPhrase(), "OK")      }    }  }

此代码中最重要的一部分是 HttpClient 样板 — 感兴趣的读者应该查阅 HttpClient API 文档了解详细信息。假设连接到公共 Internet 的网络可用(并且 Twitter 并未修改其公共 API),那么该测试应该能顺利通过。

鉴于此,我们详细分析 Scitter 客户机的第一部分。这意味着我们需要解决一个设计问题:如何构建 Scitter 客户机来处理经过验证和未经过验证的调用。目前,我将采用典型的 Scala 方式,假定验证是 “按对象” 执行的,因此将需要验证的调用放在类定义中,并在未验证的调用放在对象定义中:

清单 4. Scitter.test

package com.tedneward.scitter  {       object Scitter    {      import org.apache.commons.httpclient._, methods._, params._, cookie._            def test : Boolean =      {        val client = new HttpClient()         val method = new GetMethod("http://twitter.com/help/test.xml")         method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))         client.executeMethod(method)                val statusLine = method.getStatusLine()        statusLine.getStatusCode() == 200     }    }       class Scitter(username : String, password : String)    {    }  }

目前,我们将网络抽象放在一边 — 稍后,当离线测试变得更加重要时再添加它。当我们更好地理解如何使用 HttpClient 类时,这还将帮助避免 “过度抽象” 网络通信。

由于已经明确区分了验证和未验证 Twitter 客户机,因此我们将快速创建一个经过验证的方法。看上去 Twitter 提供了一个可验证用户登录凭证的 API。再次,HttpClient 代码将类似于之前的代码,除了将用户名和密码传递到 Twitter API 中之外。

这引出了 Twitter 如何验证用户的概念。快速查看 Twitter API 页面后,可以发现 Twitter 使用的是一种 Stock HTTP 验证方法,这与任何经过验证的资源在 HTTP 中的方法相同。这意味着 HttpClient 代码必须提供用户名和密码作为 HTTP 请求的一部分,而不是作为 POST 的主体,如清单 5 所示:

清单 5. 您好 Twitter,是我!

package com.tedneward.scitter.test  {    class ExplorationTests    {      def testUser = "TwitterUser"  def testPassword = "TwitterPassword"         @Test def verifyCreds =      {        val client = new HttpClient()         val verifyCredsURL = "http://twitter.com/account/verify_credentials.xml"       val method = new GetMethod(verifyCredsURL)         method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))         client.getParams().setAuthenticationPreemptive(true)        val defaultcreds = new UsernamePasswordCredentials(testUser, testPassword)        client.getState().setCredentials(new AuthScope("twitter.com", 80,                                                       AuthScope.ANY_REALM), defaultcreds)                client.executeMethod(method)                val statusLine = method.getStatusLine()                assertEquals(200, statusLine.getStatusCode())        assertEquals("OK", statusLine.getReasonPhrase())      }    }  }

注意,要让此测试顺利通信,用户名和密码字段将需要输入 Twitter 能接收的内容 — 我在开发时使用了自己的 Twitter 用户名和密码,但显然您需要使用自己设定的用户名和密码。注册新的 Twitter 帐户相当简单,因此我假定您已经拥有一个帐户,或者知道如何注册(很好。我会等待完成此任务)。

完成后,使用用户名和密码构造函数参数将它映射到 Scitter 类非常简单,如清单 6 所示:

清单 6. Scitter.verifyCredentials

package com.tedneward.scitter  {    import org.apache.commons.httpclient._, auth._, methods._, params._     // ...        class Scitter(username : String, password : String)    {           def verifyCredentials : Boolean =      {        val client = new HttpClient()         val method = new GetMethod("http://twitter.com/help/test.xml")         method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))                  client.getParams().setAuthenticationPreemptive(true)        val creds = new UsernamePasswordCredentials(username, password)        client.getState().setCredentials(          new AuthScope("twitter.com", 80, AuthScope.ANY_REALM), creds)         client.executeMethod(method)                val statusLine = method.getStatusLine()        statusLine.getStatusCode() == 200     }    }  }

清单 7 中相应的 Scitter 类测试也相当简单:

清单 7. 测试 Scitter.verifyCredentials

package com.tedneward.scitter.test  {    class ScitterTests    {      import org.junit._, Assert._      import com.tedneward.scitter._       def testUser = "TwitterUsername"       def testPassword = "TwitterPassword"             // ...         @Test def verifyCreds =      {        val scitter = new Scitter(testUser, testPassword)        val result = scitter.verifyCredentials        assertTrue(result)      }    }  }

不算太糟。库的基本结构已经成形,但显然还有很长的路要走,特别是因为目前实际上未执行任何特定于 Scala 的任务 — 在面向对象设计中,库的构建并不像练习那样简单。因此,我们开始使用一些 XML,并通过更加合理的格式将它返回。

从 XML 到对象

现在可以添加的最简单的 API 是 public_timeline,它收集 Twitter 从所有用户处接收到的最新的 n 更新,并返回它们以便于进行使用。与之前讨论的另外两个 API 不同,public_timeline API 返回一个响应主体(而不是仅依赖于状态码),因此我们需要分解生成的 XML/RSS/ATOM/,然后将它们返回给 Scitter 客户机。

现在,我们编写一个探索测试,它将访问公共提要并将结果转储到 stdout 以便进行分析,如清单 8 所示:

清单 8. 大家都在忙什么?

package com.tedneward.scitter.test  {    class ExplorationTests    {      // ...          @Test def callTwitterPublicTimeline =      {        val publicFeedURL = "http://twitter.com/statuses/public_timeline.xml"               // HttpClient API 101        val client = new HttpClient()        val method = new GetMethod(publicFeedURL)        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))                client.executeMethod(method)                val statusLine = method.getStatusLine()        assertEquals(statusLine.getStatusCode(), 200)        assertEquals(statusLine.getReasonPhrase(), "OK")                val responseBody = method.getResponseBodyAsString()        System.out.println("callTwitterPublicTimeline got... ")        System.out.println(responseBody)      }    }  }

运行后,结果每次都会有所不同,因为公共 Twitter 服务器上有许多用户,但通常应与清单 9 的 JUnit 文本文件转储类似:

清单 9. 我们的 Tweets 结果

< statuses type="array">     < status>       < created_at>Tue Mar 10 03:14:54 +0000 2009< /created_at>       < id>1303777336< /id>       < text>She really is. http://tinyurl.com/d65hmj< /text>       < source>< a href="http://iconfactory.com/software/twitterrific">twitterrific< /a>         < /source>       < truncated>false< /truncated>       < in_reply_to_status_id>< /in_reply_to_status_id>       < in_reply_to_user_id>< /in_reply_to_user_id>       < favorited>false< /favorited>       < user>           < id>18729101< /id>           < name>Brittanie< /name>           < screen_name>brittaniemarie< /screen_name>           < description>I'm a bright character. I suppose.< /description>           < location>Atlanta or Philly.< /location>           < profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/                               81636505/goodish_normal.jpg< /profile_image_url>           < url>http://writeitdowntakeapicture.blogspot.com< /url>           < protected>false< /protected>           < followers_count>61< /followers_count>       < /user>     < /status>     < status>       < created_at>Tue Mar 10 03:14:57 +0000 2009< /created_at>       < id>1303777334< /id>       < text>Number 2 of my four life principles.  "Life is fun and rewarding"< /text>       < source>web< /source>       < truncated>false< /truncated>       < in_reply_to_status_id>< /in_reply_to_status_id>       < in_reply_to_user_id>< /in_reply_to_user_id>       < favorited>false< /favorited>       < user>           < id>21465465< /id>           < name>Dale Greenwood< /name>           < screen_name>Greeendale< /screen_name>           < description>Vegetarian. Eat and use only organics.                          Love helping people become prosperous< /description>           < location>Melbourne Australia< /location>           < profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/                               90659576/Dock_normal.jpg< /profile_image_url>           < url>http://www.4abundance.mionegroup.com< /url>           < protected>false< /protected>           < followers_count>15< /followers_count>        < /user>      < /status>        (A lot more have been snipped)  < /statuses>

通过查看结果和 Twitter 文档可以看出,调用的结果是一组具备一致消息结构的简单 “状态” 消息。使用 Scala 的 XML 支持分离结果相当简单,但我们会在基本测试通过后立即简化它们,如清单 10 所示:

清单 10. 大家都在忙什么?

package com.tedneward.scitter.test  {    class ExplorationTests    {      // ...          @Test def simplePublicFeedPullAndParse =      {        val publicFeedURL = "http://twitter.com/statuses/public_timeline.xml"               // HttpClient API 101        val client = new HttpClient()        val method = new GetMethod(publicFeedURL)        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))        val statusCode = client.executeMethod(method)        val responseBody = new String(method.getResponseBody())                val responseXML = scala.xml.XML.loadString(responseBody)        val statuses = responseXML \\ "status"        for (n < - statuses.elements)        {          n match          {            case < status>{ contents @ _*}< /status> =>            {              System.out.println("Status: ")              contents.foreach((c) =>                c match                {                  case < text>{ t @ _*}< /text> =>                    System.out.println("\tText: " + t.text.trim)                  case < user>{ contents2 @ _* }< /user> =>                  {                    contents2.foreach((c2) =>                      c2 match                      {                        case < screen_name>{ u }< /screen_name> =>                          System.out.println("\tUser: " + u.text.trim)                        case _ =>        ()                      }                    )                  }                  case _ =>        ()                }              )            }            case _ =>              () // or, if you prefer, System.out.println("Unrecognized element!")          }        }      }    }  }

随着示例代码模式的变化,这并不值得推荐 — 这有点类似于 DOM,依次导航到各个子元素,提取文本,然后导航到另一个节点。我可以仅执行两个 XPath 样式的查询,如清单 11 所示:

清单 11. 替代解析方法

for (n < - statuses.elements)  {       val text = (n \\ "text").text         val screenName = (n \\ "user" \ "screen_name").text  }

这显然更加简短,但它带来了两个基本问题:

我们可以强制 Scala 的 XML 库针对每个元素或子元素遍历一次图,其速度会随时间减慢。

我们仍然需要直接处理 XML 消息的结构。这是两个问题中最为重要的。

也就是说,这种方式不具备可伸缩性 — 假设我们最终对 Twitter 状态消息中的每个元素都感兴趣,我们将需要分别从各状态中提取各个元素。

这又造成了另一个与各格式本身相关的问题。记住,Twitter 可以使用四种不同的格式,并且我们不希望 Scitter 客户机需要了解它们之间的任何差异,因此 Scitter 需要一个能返回给客户机的中间结构,以便未来使用,如清单 12 所示:

清单 12. Breaker,您的状态是什么?

abstract class Status  {    val createdAt : String    val id : Long    val text : String    val source : String    val truncated : Boolean    val inReplyToStatusId : Option[Long]    val inReplyToUserId : Option[Long]    val favorited : Boolean    val user : User  }

这与 User 方式相类似,考虑到简洁性,我就不再重复了。注意,User 子元素有一个有趣的问题 — 虽然存在 Twitter 用户类型,但其中内嵌了一个可选的 “最新状态”。状态消息还内嵌了一个用户。对于这种情况,为了帮助避免一些潜在的递归问题,我选择创建一个嵌入在 Status 内部的 User 类型,以反映所出现的 User 数据;反之亦然,Status 也可以嵌入在 User 中,这样可以明确避免该问题。(至少,在没发现问题之前,这种方法是有效的)。

现在,创建了表示 Twitter 消息的对象类型之后,我们可以遵循 XML 反序列化的公共 Scala 模式:创建相应的对象定义,其中包含一个 fromXml 方法,用于将 XML 节点分离到对象实例中,如清单 13 所示:

清单 13. 分解 XML

 object Status  {    def fromXml(node : scala.xml.Node) : Status =    {      new Status {        val createdAt = (node \ "created_at").text        val id = (node \ "id").text.toLong        val text = (node \ "text").text        val source = (node \ "source").text        val truncated = (node \ "truncated").text.toBoolean        val inReplyToStatusId =          if ((node \ "in_reply_to_status_id").text != "")            Some((node \"in_reply_to_status_id").text.toLong)          else           None        val inReplyToUserId =           if ((node \ "in_reply_to_user_id").text != "")            Some((node \"in_reply_to_user_id").text.toLong)          else           None        val favorited = (node \ "favorited").text.toBoolean        val user = User.fromXml((node \ "user")(0))      }    }  }

其中最强大的一处是,它可以针对 Twitter 支持的其他任何格式进行扩展 — fromXml 方法可以在分解节点之前检查它是否保存了 XML、RSS 或 Atom 类型的内容,或者 Status 可以包含 fromXml、fromRss、fromAtom 和 fromJson 方法。实际上,后一种方法是我的优先选择,因为它会平等对待基于 XML 的格式和 JSON(基于文本)格式。

好奇和细心的读者会注意到在 Status 及其内嵌 User 的 fromXml 方法中,我使用的是 XPath 样式的分解方法,而不是之前建议的遍历内嵌元素的方法。现在,XPath 样式的方法看上去更易于阅读,但幸运的是,我后来改变了注意,良好的封装仍然是我的朋友 — 我可以在随后修改它,Scitter 外部的任何人都不会知道。

注意 Status 内部的两个成员如何使用 Option[T] 类型;这是因为这些元素通常排除在 Status 消息外部,并且虽然元素本身会出现,但它们显示为空(类似于 < in_reply_to_user_id>< /in_reply_to_user_id>)。这正是 Option[T] 的作用所在。当元素为空时,它们将使用 “None” 值。(这表示考虑到基于 Java 的兼容性,访问它们会更加困难,但惟一可行方法是对最终生成的 Option 实例调用 get(),这不太复杂并且能很好地解决 “非 null 即 0” 问题)。

现在已经可以轻而易举地使用公共时间轴:

清单 14. 分解公共时间轴

@Test def simplePublicFeedPullAndDeserialize =  {    val publicFeedURL = "http://twitter.com/statuses/public_timeline.xml"       // HttpClient API 101    val client = new HttpClient()    val method = new GetMethod(publicFeedURL)    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,       new DefaultHttpMethodRetryHandler(3, false))    val statusCode = client.executeMethod(method)    val responseBody = new String(method.getResponseBody())        val responseXML = scala.xml.XML.loadString(responseBody)    val statuses = responseXML \\ "status"    for (n < - statuses.elements)    {      val s = Status.fromXml(n)      System.out.println("\t'@" + s.user.screenName + "' wrote " + s.text)    }  }

显然,这看上去更加简洁,并且易于使用。

将所有这些结合到 Scitter 单一实例中相当简单,仅涉及执行查询、解析各个 Status 元素以及将它们添加到 List[Status] 实例中,如清单 15 所示:

清单 15. Scitter.publicTimeline

package com.tedneward.scitter  {    import org.apache.commons.httpclient._, auth._, methods._, params._    import scala.xml._     object Scitter    {      // ...               def publicTimeline : List[Status] =      {        import scala.collection.mutable.ListBuffer              val client = new HttpClient()         val method =            new GetMethod("http://twitter.com/statuses/public_timeline.xml")         method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,           new DefaultHttpMethodRetryHandler(3, false))         client.executeMethod(method)                val statusLine = method.getStatusLine()        if (statusLine.getStatusCode() == 200)        {          val responseXML =            XML.loadString(method.getResponseBodyAsString())           val statusListBuffer = new ListBuffer[Status]           for (n < - (responseXML \\ "status").elements)            statusListBuffer += (Status.fromXml(n))                    statusListBuffer.toList        }        else       {          Nil        }      }    }  }

在实现功能全面的 Twiter 客户机之前,我们显然还有很长的路要走。但到目前为止,我们已经实现基本的行为。

感谢各位的阅读,以上就是“Twitter是什么”的内容了,经过本文的学习后,相信大家对Twitter是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Twitter是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Twitter是什么

这篇文章主要讲解了“Twitter是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Twitter是什么”吧!Twitter 迅速占领了 Internet 市场。您肯定知道这个出色的社交网
2023-06-17

如何将twitter帐户快速添加到Win8人脉有什么好的方法

在Win8系统中,跟往常的系统相比新增加了“人脉”的功能,此功能让用户们激动不已,可又苦于不知道如何将twitter帐户添加至其中。那么今天我们就为大家介绍下添加的操作方法吧。我们可通过人脉应用添加twitter帐户
2023-06-06

怎么将Twitter消息导入到SAP CRM和Cloud for Customer去

这篇文章主要讲解了“怎么将Twitter消息导入到SAP CRM和Cloud for Customer去”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么将Twitter消息导入到SAP C
2023-06-04

怎么使用这个Twitter客户端在Linux终端中发推特

小编给大家分享一下怎么使用这个Twitter客户端在Linux终端中发推特,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过 Rainbow Stream 跟上T
2023-06-16

什么是 ipsec?SDN 是什么?

IPsec是一种协议套件,用于确保IP网络通信的安全,提供保密性、完整性和身份验证。SDN是一种网络架构,将网络控制平面与数据平面分离,集中控制和可编程性。两者的结合可增强网络安全性和可编程性:SDN可动态配置IPsec策略,IPsec增强SDN网络安全性,SDN简化IPsec管理。
什么是 ipsec?SDN 是什么?
2024-04-02

Windows Vista是什么?什么是Windows Vista

我身边很多朋友对Windows Vista是什么一点都不知道,经常来问我,所以今天我就像大家详细介绍Windows Vista这个操作系统,如有不足,还请大家见谅,好了,进入正题:Windows Vista是微软公司的一款视窗操作系统。微软
2023-06-05

Spring之什么是ObjectFactory?什么是ObjectProvider?

这篇文章主要介绍了Spring之什么是ObjectFactory?什么是ObjectProvider?具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-01

window.setinterval是什么 其作用是什么

window.setInterval是一个JavaScript方法,它允许您周期性地执行指定的函数或代码块。该方法以指定的时间间隔(以毫秒为单位)触发指定的函数。window.setInterval的语法如下:javascriptsetIn
2023-07-12

colspan_colspan是什么意思?作用是什么

colspan是HTML中的一个属性,用于指定一个单元格横跨的列数。作用是将一个单元格合并为多个列,使得该单元格占据更大的水平空间。例如,如果一个表格中有两列,而某个单元格需要占据这两列的水平空间,可以使用colspan属性将该单元格的co
2023-08-22

什么是DHCP?什么是DHCP服务器

DHCP是Dynamic Host Configuration Protocol(动态主机配置协议)的缩写,它是一种网络协议,常用于局域网(LAN)中自动分配IP地址和其他网络配置信息给客户端设备。DHCP服务器是运行DHCP协议的服务器,
2023-09-05

c#什么是委托什么是事件

委托是一种指向方法的引用类型,用于实现松散耦合,而事件是一种特殊委托,用于事件处理。委托可将调用方法的职责转移到接收方,提高代码可重用性。事件允许对象向订阅者通知事件发生,订阅者可响应事件。使用委托需要定义一个与所调方法签名相同的委托类型,
c#什么是委托什么是事件
2024-04-04

c++中什么是类,什么是对象

c++kquote>类在 c++ 中代表对象集合的模板,定义了对象的属性(数据成员)和行为(成员函数)。对象是类的实例,拥有类中的所有数据成员和成员函数,由类创建,并使用与类相同的数据类型。类和对象在 C++ 中的作用什么是类?类是
c++中什么是类,什么是对象
2024-05-08

java中什么是类,什么是对象

类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。对象就是一个真实世界中的实体,对象与实体是一一对应关系的,意思就是现实世界的每一个实体都是一个对象,所
java中什么是类,什么是对象
2020-06-27

DHCP是什么?工作原理是什么?

  在设置无线AP或无线路由器过程中,用户会遇到很多参数,如果只是完成一般的设置,满足一般的上网需求的话,有以一些参数是不需要深入了解的。但是在一些比较复杂的网络环境就需要我们对一些参数作相应的配置,今天我们来看一下无线路由器的参数之一DHCP。  1、DHCP的作用  DHCP(Dynamic Host Confif
DHCP是什么?工作原理是什么?
2024-04-18

什么是软考?软考全称是什么

  什么是软考?对于软考很多人可能并不了解,初次听到甚至可能会觉得很好奇。其实软考只是一种考试的简称,那么软考全称是什么呢?  什么是软考?  软考全称是计算机技术与软件专业技术资格(水平)考试(以下简称计算机资格考试),是由国家人力资源和社会保障部(原人事部,以下简称人社部)、工业和信息化部(原信息产业部,以下简称工
什么是软考?软考全称是什么
2024-04-18

什么是软考软考全称是什么

  软考也叫软件水平考试,全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部(原人事部)、工业和信息化部(原信息产业部)领导的国家级考试。  软考全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部(原人事部)、工业和信息化部(原信息产业部)领导的国家级考试,其目的是,科学
什么是软考软考全称是什么
2024-04-18

软考是什么考试?全称是什么?

  软考也叫软件水平考试,全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部(原人事部)、工业和信息化部(原信息产业部)领导的国家级考试,其目的是,科学、公正地对全国计算机与软件专业技术人员进行职业资格、专业技术资格认定和专业技术水平测试。  根据原人事部、原信息产业部颁布的《关于印发〈计算机技
软考是什么考试?全称是什么?
2024-04-19

css是什么?有什么用?

CSS是什么东西?CSS,即层叠样式表(Cascading Style Sheets),是一种用于网页设计的样式语言。通过CSS,你可以改变HTML页面上各个元素的外观、布局和行为。CSS最初是由赛迪公司(斯佩克特公司)的开发者创建的,并于1996年成为一项业界标准。随着互联网的发展,在HTML语言出现之后,CSS已经成为了使用最广泛的网页设计工具之一。让我们来看一下CSS有哪
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录