我们的网络团队使用InfoBlox存储有关IP范围的信息(位置,国家/地区等) 有一个API可用,但Infoblox的文档和示例不太实用。
我想通过API搜索有关IP的详细信息。首先 - 我很乐意从服务器上获得任何回报。我修改了the only example I found
import requests
import json
url = "https://10.6.75.98/wapi/v1.0/"
object_type = "network"
search_string = {'network':'10.233.84.0/22'}
response = requests.get(url + object_type, verify=False,
data=json.dumps(search_string), auth=('adminname', 'adminpass'))
print "status code: ", response.status_code
print response.text
返回错误400
status code: 400
{ "Error": "AdmConProtoError: Invalid input: '{\"network\": \"10.233.84.0/22\"}'",
"code": "Client.Ibap.Proto",
"text": "Invalid input: '{\"network\": \"10.233.84.0/22\"}'"
}
我很感激设法让这个API与Python一起工作的人的任何指示。
<小时/> 更新:跟进解决方案,下面是一段代码(它可以工作,但它不好,精简,不能完美地检查错误等)如果有人有一天会有需要和我一样做。
def ip2site(myip): # argument is an IP we want to know the localization of (in extensible_attributes)
baseurl = "https://the_infoblox_address/wapi/v1.0/"
# first we get the network this IP is in
r = requests.get(baseurl+"ipv4address?ip_address="+myip, auth=('youruser', 'yourpassword'), verify=False)
j = simplejson.loads(r.content)
# if the IP is not in any network an error message is dumped, including among others a key 'code'
if 'code' not in j:
mynetwork = j[0]['network']
# now we get the extended atributes for that network
r = requests.get(baseurl+"network?network="+mynetwork+"&_return_fields=extensible_attributes", auth=('youruser', 'youpassword'), verify=False)
j = simplejson.loads(r.content)
location = j[0]['extensible_attributes']['Location']
ipdict[myip] = location
return location
else:
return "ERROR_IP_NOT_MAPPED_TO_SITE"
答案 0 :(得分:3)
通过使用requests.get和json.dumps,您是否在向查询字符串添加JSON时发送GET请求?基本上,做一个
GET https://10.6.75.98/wapi/v1.0/network?{\"network\": \"10.233.84.0/22\"}
我一直在使用带有Perl的WebAPI,而不是Python,但如果这是你的代码尝试做事的方式,它可能不会很好地工作。要将JSON发送到服务器,请执行POST并添加&#39; _方法&#39;与&#39; GET&#39;的争论作为价值:
POST https://10.6.75.98/wapi/v1.0/network
Content: {
"_method": "GET",
"network": "10.233.84.0/22"
}
Content-Type: application/json
或者,不要将JSON发送到服务器并发送
GET https://10.6.75.98/wapi/v1.0/network?network=10.233.84.0/22
我猜您将通过从代码中删除json.dumps并将search_string直接传递给requests.get来实现。