2012-04-24 118 views
1

我想知道Intersango API(文档记录不完整)的正确URL格式。我在C#编程我的客户,但我看Python example和我有点困惑,什么是真正被放置在请求主体:如何向Intersango API发送请求

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的人,并且他们能够告诉我该线路上发生了什么的代码。

+0

你能够使它发挥作用?我遵循相同的步骤,但根本无法获得经过身份验证的API工作,得到{“远程服务器返回错误:(417)期望失败。”} – galets 2012-06-20 04:01:55

回答

1

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

params.append(('api_key',self.api_key))又增加了2元列表现有PARAMS列表。

最后,urllib.urlencode借此列表,并将它转换成一个PROPERT url编码字符串,在这种情况下,它会返回一个字符串key1=value1&key2=value2&api_key=23423如果你的密钥或值中有任何特殊字符,urlencode会对它们进行编码,参见documentation for urlencode

1

我试图让C#代码工作,并且它保持失败,异常{“远程服务器返回一个错误:(417)期望失败。“}我终于发现问题所在,你可以阅读它在深入here

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

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

下面是一个示例代码:

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(); 
1

蛋糕 代替params.append(('api_key',self.api_key)) 的片只写:

params['api_key']=self.api_key