2013-03-06 40 views
0

我需要连接到RESTful API。公司给我连接到他们的API的唯一例子就是Python中的一个例子。我不懂这门语言,但对PHP很满意。有没有办法可以用cuRL和/或PHP来做到这一点?将python API示例转换为PHP

这里是在Python的例子:

import requests 
import hmac 
import hashlib 
import datetime as dt 
import simplejson as json 
import sys 


tech_prefix = '' #the Account Tech Prefix 
secret_key = '' #the API Key 


#creating URI info 
t = dt.datetime.utcnow().replace(microsecond=0) 
timestamp = t.isoformat() 
url_scheme = 'https' 
net_location = 'api.thesite.com' 
path = '/v1/available-tns/npas/' 
method = 'GET' 
ordered_query_params = '' 
body = '' 
body_md5 = '' 
canonical_uri = url_scheme + "://" + net_location + path + "\n" + ordered_query_params 
tokens = (
    timestamp, 
    method, 
    body_md5, 
    canonical_uri 
    ) 
message_string = u'\n'.join(tokens).encode('utf-8') 
signature = hmac.new(secret_key, message_string, digestmod=hashlib.sha1).hexdigest() 

headers = {'X-Timestamp':timestamp} 
request_url = url_scheme + '://' + net_location + path + '?' + ordered_query_params # append ordered query params here 
request = requests.get(request_url,auth=(tech_prefix,signature),headers=headers) 
print request 

回答

2

是的,你可以在PHP中做到这一点。这个python代码不使用任何特殊的python库;它只是发送一个带有特定头文件和特定认证信息的HTTP请求。实际上,将这段代码从python转换成PHP不属于典型的StackOverflow答案的范围。

+0

+1为了确保它是可能的,但没有这样做。 – 2013-03-06 00:59:10

+0

谢谢,我经常使用curl,但是使用这个APIs auth需要时间戳和散列api key来发回一个响应代码,我输了。我想我确实需要将此代码转换为PHP或基于此代码的卷曲示例。 – 2013-03-06 01:08:55

0

首先,“进口”只是外部库,PHP内置了它们。一切都达到令牌只是变量。日期和时间方法在PHP中都有类似的功能。然后“令牌”只是一个数组。然后,“message_string”有一个“连接”和“编码”方法,这些方法类似于您在JavaScript中可以找到的方法。 “签名”有点混乱,但它基本上做了一个加密和PHP具有类似的功能。 Python是有据可查的,所以查看Python的函数,然后你应该能够找出哪个PHP函数是相似的。在“签名”之后,它只是将所有变量组装到HTTP请求中并发送它。

Python和PHP(和JavaScript)是基于C的语言。如果你对一个人有好处,你可以找出另一个人,只要你有很好的参考资料。正如Python所记载的那样,所以谷歌搜索Python方法或函数应该能够找到你需要的信息来找到它的PHP等价物。

API的工作从来没有乐趣,但它们并非不可能。他们中的大多数都会分解为仅仅需要组装的HTTP请求,然后解析响应。一个小技巧,有时你可以在API的文档或他们的论坛中找到(如果他们有他们的话),或者技术支持人员会给你发送HTTP请求的例子。然后你可以用PHP构建它。

作为结束语,最好学习如何在语言之间进行转换。听起来这是你的第一次体验,但大多数web开发人员经常遇到这种情况,并且遇到了各种不同的语言(python,C++,asp,ruby等)。根据我过去遇到的情况,你的转换很简单。我非常喜欢将它作为我必须使用的最后一个API的示例。