1

我试图弄清楚Intersango API的正确 URL 格式是什么(文档很少)。我正在用 C# 编写我的客户端,但我正在查看Python 示例,我对实际放置在请求正文中的内容有点困惑:

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、逗号分隔的东西,还是它究竟是如何被序列化的?当参数被编码并分配给它时,主体会是什么样子?

PS我没有任何东西可以用来运行代码,所以我可以调试它,但我只是希望这对于了解Python的人来说足够简单,并且他们能够告诉我发生了什么行代码。

4

3 回答 3

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 将对它们进行 %encode。请参阅urlencode 的文档

于 2012-04-24T04:11:09.733 回答
1

我试图让 C# 代码工作,但它一直失败并出现异常 {“远程服务器返回错误:(417) 预期失败。”}。我终于找到了问题所在。你可以在这里深入了解它

简而言之,让 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();
于 2012-06-20T04:40:43.997 回答
1

小菜一碟,而params.append(('api_key',self.api_key)) 不仅仅是写:

params['api_key']=self.api_key
于 2012-08-05T19:59:10.400 回答