如何向Intersango API发出请求

时间:2012-04-24 02:57:24

标签: python httprequest

我正在试图弄清楚Intersango API的正确网址格式是什么(文档记录很少)。我正在使用C#编写我的客户端,但是我正在查看Python example并且我对请求正文中实际放置的内容感到有些困惑:

def make_request(self,call_name,params):
    params.append(('api_key',self.api_key)) // <-- How does this get serialized?
    body = urllib.urlencode(params) 

    self.connect()

    try:
        self.connection.putrequest('POST','/api/authenticated/v'+self.version+'/'+call_name+'.php')
        self.connection.putheader('Connection','Keep-Alive')
        self.connection.putheader('Keep-Alive','30')
        self.connection.putheader('Content-type','application/x-www-form-urlencoded')
        self.connection.putheader('Content-length',len(body))
        self.connection.endheaders()

        self.connection.send(body)

        response = self.connection.getresponse()

        return json.load(response)
//...

我无法弄清楚这段代码:params.append(('api_key',self.api_key))

它是某种字典,可以序列化为JSON,逗号分隔,或者它是如何被序列化的?当参数被编码并分配给它时,身体会是什么样子?

P.S。我没有任何可以运行代码的东西,所以我可以调试它,但我只是希望这很简单,可以理解知道Python的人,他们可以告诉我在那行上发生了什么代码。

3 个答案:

答案 0 :(得分:1)

params是一个包含2个元素的列表。该列表看起来像((key1, value1), (key2, value2), ...)

params.append(('api_key',self.api_key))在现有的参数列表中添加了另一个2元素列表。

最后,urllib.urlencode获取此列表并将其转换为属性urlencoded字符串。在这种情况下,它将返回一个字符串key1=value1&key2=value2&api_key=23423。如果您的键或值中有任何特殊字符,urlencode将对它们进行%编码。见documentation for urlencode

答案 1 :(得分:1)

我试图使C#代码正常工作,并且它一直失败,异常{“远程服务器返回错误:(417)期望失败。”}。我终于找到了问题所在。您可以深入了解here

简而言之,使C#访问Intersango API的方法是添加以下代码:

System.Net.ServicePointManager.Expect100Continue = false;

此代码只需运行一次。这是一个全局设置,因此它会影响您的完整应用程序,因此请注意其他内容可能因此而中断。

以下是示例代码:

System.Net.ServicePointManager.Expect100Continue = false;
var address = "https://intersango.com/api/authenticated/v0.1/listAccounts.php";
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var postBytes = Encoding.UTF8.GetBytes("api_key=aa75***************fd65785");
request.ContentLength = postBytes.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(postBytes, 0, postBytes.Length);
dataStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

答案 2 :(得分:1)

一块蛋糕 而不是params.append(('api_key',self.api_key)) 只写:

params['api_key']=self.api_key