json Infoblox WAPI:如何搜索IP

r1zk6ea1  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(100)

我们的网络团队使用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"

2ul0zpep

2ul0zpep1#

通过使用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并添加一个'_method'参数,并以'GET'作为值:

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来实现。

相关问题