API request in rhino python

I’m trying to build a rhino model based on a json data from an API request.
iron python does not have the requests library installed, so I get the error message: Message: ‘No module named requests’

Is there another way to acces external API’s or a way to install libraries into iron python?

I’m using rhino 5 on macos

Which specific API are you trying to request from?

You can always add PY libraries to the search Importing Python 2.7 library modules to Rhino

and this:

What protocol does the APi use?

Of course the JSON module will help interpret the data. once you receive it.

I’m trying to request from my own server, a REST http API request that returns json data that I’ll use for building geometry.

I got this far:

  • added request library to the scripts folder
  • now another library is asked for: added urllib3 to the scripts folder too
  • I get an error message when loading my python script that imports the request library:

Message: ‘module’ object has no attribute ‘_getframe’

Traceback:
line 692, in exec_, "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/urllib3/packages/six.py"
line 701, in , "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/urllib3/packages/six.py"
line 2, in , "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/urllib3/exceptions.py"
line 11, in , "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/urllib3/connectionpool.py"
line 8, in , "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/urllib3/init.py"
line 43, in , "/Users/joostbarendregt/Library/Application Support/McNeel/Rhinoceros/scripts/requests/init.py"
line 2, in , “/Users/joostbarendregt/GIT_BB/craftr_rhino/design.py”

line 692 that it’s referring to is this line:

frame = sys._getframe(1)

Tried in both rhino5 and rhino WIP

You seem to be running into this problem:

Rhino.Python runs on IronPython 2.7.5.

But is there another way to make these requests?

Have you tried the UrlLib? It is a standard module:

import urllib
file = urllib.urlopen('http://www.google.com')
print file.read()

If the data is Json, then you may be able to decode it using the JSON lib:

import json
datastore = json.loads(file.read)

Here is an example:

def readrequest():
    file = urllib.urlopen('http://feeds.citibikenyc.com/stations/stations.json')
    recieved_data =file.read()
    file.close
    datastore = json.loads(recieved_data)
    print datastore['stationBeanList'][1]

Or for even more fun:

def readrequest():
    file = urllib.urlopen('http://feeds.citibikenyc.com/stations/stations.json')
    recieved_data =file.read()
    file.close
    datastore = json.loads(recieved_data)
    for item in datastore['stationBeanList']:
        print 'The station at {} has {} available bikes.'.format(item.get('stAddress1'), item.get('availableBikes'))

Does that help?

2 Likes

urllib was not enough to make the request I wanted, but urllib2 helped out:

def requestAPIData(url, jsonRequestData):
    request = urllib2.Request(url)
    request.add_data(json.dumps(jsonRequestData))
    request.add_header("Content-type", "application/json")
    request.add_header("Accept", "application/json")

    r = urllib2.urlopen(request)
    geometryJson = json.load(r)
    return geometryJson

thanks for the help!

2 Likes

Can I ask what API service you are using that required using the request object?

I have a similar problem. I wanna send a Dictionary to my Server and receive the results. Unfortunately the requests module is not available …can you please help me with a Workaround Scott?

Best Regards, Sebastian

Grasshopper_AM.gh (6.8 KB)

An easier approach might be using a JSON plugin for Grasshopper? Would this work? https://www.food4rhino.com/app/jswan