使用PHP访问Dropbox
在这篇文章中,我们将探讨在Dropbox帐户访问文件通过构建一个简单的客户端的Dropbox API。客户端将执行一些基本操作,如认证,上市文件,上传和下载文件。
保持短期性和可读性的文章,我会保持代码到最低限度,而不是指你上PHPMaster的GitHub上提供完整的代码。要运行的代码,你需要与卷曲的支持,显然是一个PHP Dropbox帐户。
您的出发点应该是任何有关发展与Dropbox Dropbox的开发中心,在那里你可以找到它的基本概念和最佳实践的API参考。你也可以下载官方的SDK,但PHP不支持的语言中列出。还有一个链接到第三方的PHP SDK的 GitHub上。
我们的客户将结构更像是Python官方客户端,但我注意到,尤其是对OAuth的一部分,从以上的PHP SDK的一些想法和代码,。我们将有一个DropboxSession对象和DropboxClient的对象。首先照顾最困难的部分:从Dropbox的获取和管理访问凭据。客户端对象,然后将使用会话对象执行API调用和获取数据。下面的会话对象是DropboxRESTClient对象来执行HTTP调用使用cURL。
告诉Dropbox的关于您的应用程序
首先,我们需要注册我们的应用程序,以获得一个独特的API密钥对与Dropbox。我们需要这些键“引进”我们的应用程序和要求进行授权。
登录到开发中心,并遵循“MyApps”链接,然后选择“创建一个应用程序”。Dropbox的会问你的名称,描述,为您的应用程序和访问类型。
访问类型参数指定您的应用程序将能够读取和写入文件。建议值是“应用程序文件夹”,目录内用户的家中,将创建一个沙盘。选择“全Dropbox的”应用程序将用户的整个Dropbox的。
一旦你的应用程序创建的,会有一个选项页,在这里你可以编辑其详细信息,并找到其访问凭据。
新创建的应用是在“发展状态”。这让我们立即开始开发,并允许多达5个其他用户对其进行测试。应用程序是准备发布时,我们可以申请生产状况和Dropbox的团队会检讨,以确保它符合其条款及条件和品牌指引。
编码的应用程序
我把我的代码在我的本地Apache的一个子目录设置,以便它是在URL访问http://localhost/mydropbox。目录结构是:
bootstrap.php文件,执行应用程序的启动,将在每个前端文件,所以让我们开始讨论,。
我初始化一个全局配置为一个空数组变量,然后指定一些配置值。前三Dropbox的相关访问密钥,密钥,并从您的应用程序的详细信息页面的访问类型。然后,我定义其他一些有用的设置:应用程序的基根的路径,保存一些数据,和一个PHP文件的路径,将包含应用程序的访问令牌。
这个访问令牌文件的文件中不存在的开始;它创建由authorize.php页和充满Dropbox的所提供的凭据。这将是一个标准的PHP文件,如果存在,将被纳入这个脚本后。令牌文件的内容将类似于:
<?php
$access_token = array (
"oauth_token_secret" => "abcdefghilmnopqr",
"oauth_token" => "stuvwxyzabcdefgh",
"uid" => "1234567"
);
oauth_token和oauth_token_secret访问凭据,UID是用户的唯一ID。
我在下一节的引导文件设置PHP的错误行为,并执行一些要求检查;为了运行应用程序的数据目录必须存在和可写的auth.php文件必须是可写的,如果它存在。这将确保应用程序可以自由地完成其工作。
最后,我包括我们的图书馆,PHP会话初始化,设置一个空美元access_token(稍后将填写),而且,如果它存在,包括auth.php文件。
每个前端脚本将运行里面一个主要的尝试 / 捕捉块。挖库代码之前,我们首先需要理解的流量,所以我将开始与授权周期。
授权
第一次运行我们的应用程序,在下列条件下的index.php文件将是真实的:
1 <?php
2 if (!isset($access_token)) {
3 header("Location: authorize.php");
4 exit;
5 }
访问令牌是空的,所以我将用户重定向到的authorize.php页,会管理的授权过程。
引导阶段后,我做的另一个现有令牌检查。这将确保这个脚本运行,只有当我们没有一个令牌。为了避免无限重定向循环中,auth.php文件被删除脚本块的主要渔获,如果返回的错误代码是401(无效的令牌)。
我在每一个脚本做的第一件事是创建一个新的DropboxSession与我们的API密钥的对象。当我们直接调用脚本,首要条件是假的,其他块被执行。会话对象连接到Dropbox和要求一个临时令牌。令牌,然后解析成一个数组存储到变量$ _SESSION中的下一阶段。
我们建立授权使用此令牌的URL。用户应重定向或提示访问的网址,在那里他将决定是否允许或拒绝对他的数据的访问。
授权URL可以包含一个可选的参数,返回URL。我只是通过当前脚本的URL,因此如果用户授权他重定向到我们的脚本的应用程序,这个用的时间的oauth_token和UID查询字符串传递的值。现在的首要条件评估真实的,所以我们可以去,并要求一个永久的访问令牌。
美元令牌这一要求的阵列是这个新建成oauth_token与以往oauth_token_secret的,这是然后传递到的obtainAccessToken()方法。在成功的情况下,我们有我们的永久(直至撤销)访问令牌。这必须存储在某个地方,显而易见的选择是一个数据库,但在这个例子中,我们将出口作为有效的PHP代码使用本地var_export()函数和它写入我们auth.php文件中。然后将用户重定向到索引页面,这是最简单的脚本。
在我们开始尝试 / 捕捉阻止一个新DropboxSession对象被创建,永久这次$ access_token作为第四个参数。此对象用于创建的DropboxClient对象。这两个步骤是共同所有其他脚本。
客户端的公共方法映射到相应的Dropbox的API调用。我打电话的AccountInfo()方法,返回一个数组,包含用户的详细资料:唯一的ID,姓名,电子邮件,配额信息和推介链接(指正式文件的更多细节)。
幕后:REST和会话对象
现在,我们有一个表面流的概述,让我们看到引擎盖下发生的事情,我们的Dropbox的库包含在lib / Dropbox的目录中,包括三类。
静止的物体
最低水平一流,我们的图书馆是REST客户端(见LIB /保管箱/ rest.php)。这个类是为卷曲简单的包装。它执行HTTP调用,并返回在原料或编码格式的输出,或在一个错误的情况下抛出异常。
构造检查cURL是在系统上安装,或者抛出一个异常。然后,它尝试初始化内部卷曲与处理程序美元curlDefaults设置。析构函数里面没有设置该处理程序。
()的错误,并将errno() ,()方法是不言自明。然后,我们有一系列实用的方法,得到() ,后()和put()方法简单的包装,所有的主要要求()方法,它的实际工作。
首先,我们设置了URL获取HTTP方法和所需的参数,额外的头和POST(如有)。沿URL呼叫者方法为GET和PUT方法的参数传递。
在进行调用之前,我们需要告诉卷曲检索的全部内容,包括HTTP头(设置选项CURLOPT_HEADER),因为一些API的方法(当然file_get() )把他们的信息,在头。
卷曲的请求被执行存储到curl_exec()的结果为响应和元信息的变量是由的充满curl_info()有关执行细节。如果提出的方法,我们也将不得不关闭输入文件句柄。
元响应的内容和元信息,我们分析的结果,并从身体中分离出来的HTTP头。默认情况下,身体返回的JSON解码,除非美元的原始参数设置为true。
怎么回事之前,有一个错误检查。Dropbox的API使用HTTP错误代码错误通知。如果状态码是大于400,则出现了错误和错误信息被储存在体内的含量。我提取这个消息,并抛出一个异常。如果没有错误的HTTP头解析结果返回的数组包含状态代码,头和身体。
Session对象
DropboxSession对象扩展的基本REST客户端,以填补我们的需求:
执行初始认证/授权的流量,
包括在以后每次REST请求获得验证数据。
构造简单initiazlizes内部变量。另一种简单的方法是buildAuthorizeURL()建立的临时令牌授权URL。类的最重要的方法是:
obtainRequestToken() -请求一个临时的OAuth访问令牌。
obtainAccessToken() -要求永久OAuth的应用程序的访问令牌。
取() -执行其余打电话,包括所有必要的认证和签名参数。
这三种方法也有类似的流动。首先,他们建立的基本目标URL和填写的params美元,与所需的关联数组oauth_ *键/值发送。每个API调用都必须提供一个时间戳和一个唯一的随机生成的哈希,美元的nonce参数。
然后使用HTTP方法的名称,URL,参数生成签名。它然后排队美元的params数组使用oauth_signature键。网址是牵强与给定的HTTP方法和返回响应的身体的一部分。对于GET和PUT方法,生成的查询字符串附加到URL使用的的本地http_build_query()函数。
的obtainRequestToken和obtainAccessToken()几乎是相同的:一是不使用令牌和一个GET HTTP方法调用。第二个被称为一个POST HTTP方法必须包括与以前的调用获得的令牌。此标记,然后用以下所有的API调用的签名密钥的一部分。
取()方法执行一些额外的任务。首先,它需要一个数组名为$ ARGS与特定的API所需的任何额外的参数,例如资源列表或上传/下载文件的路径。这些参数与美元的params数组合并之前生成签名。唯一的例外是使用PUT方法上传文件,输入文件中的参数,提取和保存,为以后。一个开关语句被用来告诉正确的HTTP方法来调用。补充:Web开发 , php ,