【问题标题】:Convert curl command into python code将 curl 命令转换为 python 代码
【发布时间】:2016-02-01 17:28:52
【问题描述】:
curl -v -d "api_key=kkkk&api_secret=ssss&endpoint=eeee&app=aaaa&params=[{"money":"1111", "last":"0.045"}, {"money": "1111", "last":"0.05"}]... > 500 records" http://my_server:port/api/process/json

这个应该转换成 python 脚本,因为我的目标是这些 json 部分 {"money":"...", "last":"...."} 拥有超过 500 个不同的货币值.并在最后传递给服务器。

我尝试了几种不同的方法,甚至在此处寻求帮助以执行某些步骤,但始终未能达到最终的预期结果。 所以我尝试过:

cog = []
for i in range(20201, 20705):
cog.append('{"money": str(i), "last": "0.001"}')
params = tuple(cog)
p_c = {}
p_c['api_key'] = 'kkkk' 
p_c['api_secret'] = 'ssss'
p_c['app'] = 'aaaa'
p_c['endpoint'] = 'eeee'
p_c['params'] = json.dumps(params)

req1 = requests.post_simple(url=Server.My_server, params=p_c)

这个将参数作为“钱”传递:str(i) http://my_server:port/api/process/json?api_key=kkkk&api_secret=ssss&endpoint=eeee&app=aaa&params=[{"money": str(i)........

我尝试了另一个选项(现在试图找到它)​​,它弄乱了参数的顺序,使一些键值成为其他键的值

也试过了:

p_c = {}
p_c['api_key'] = 'kkkk' 
p_c['api_secret'] = 'ssss'
p_c['app'] = 'aaaa'
p_c['endpoint'] = 'eeee'

params = '{"money":"11111","last":"0.0001"},'
for i in range(20201, 20705):
    params = params + '{"money":"%d","last":"0.0001"},' % i
dat = ("params="+params)
req1 = requests.post_simple(url=Server.my_server,params=p_c, data=dat, headers=headers)

对服务器的预期传递调用应如下所示:

http://my_server:port/api/process/json?api_key=kkkk&api_secret=ssss&endpoint=eeee&app=aaa&params=[{"money": "1111", "last": "0.0001"}, {"money":"22222", "last":"0.00001"},.... ,{more than 500},........] 

【问题讨论】:

  • “这个是搞乱了 cogs 的顺序,使一些键值成为其他键”。你能解释一下吗?似乎第一个 sn-p 应该做你正在寻找的东西(一旦你修复了 for 循环的缩进)。
  • "这个搞乱了参数的顺序" 应该是参数。我的意思是,当所有内容都传递给调用链接时,看起来像 .....params=[{"money":"last", "money":"last},{"1111":"0.001"," 2222":"0.001"}......] 我完全不确定如何修复循环以便以正确的顺序传递 Key:value
  • 嗯,除了缩进cog.append(...)这一行外,还需要去掉单引号。但这不会导致您描述的问题,我不确定会发生什么。我无法重现它。
  • 如果我不删除刚刚检查的'',它会将参数传递为:“money”:str(i),甚至不会弄乱key:value
  • 正确,这就是您需要删除它们的原因。并且,再次缩进该行。

标签: python json curl


【解决方案1】:

您正在对 params 参数进行双重编码:

cog = []
for i in range(20201, 20705):
    cog.append('{"money": str(i), "last": "0.001"}')
params = tuple(cog)
...
p_c['params'] = json.dumps(params)

您编码了一个字符串序列,而您原来的 curl 命令包含一个带有 JSON 对象的 JSON 列表(Python 中的字典)。 tuple() 调用完全是多余的,元组和列表都被转换为相同的 JSON 结构。

构建字典:

cog = []
for i in range(20201, 20705):
    cog.append({"money": i, "last": "0.001"})
...
p_c['params'] = json.dumps(cog)

你可以用列表理解在一行中这样做:

cog = [{"money": i, "last": "0.001"} for i in range(20201, 20705)]
...
p_c['params'] = json.dumps(params)

请注意,-d 切换到curl 会将该数据作为POST 请求的主体发送,因此请确保使用data 参数发送参数:

req1 = requests.post(url=Server.My_server, data=p_c)

【讨论】:

  • 谢谢!!!!!!!!!有效。更重要的是,第一次遇到这个问题,现在我明白了我在做什么
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多