Heroku Platform API, Now Available in Public Beta
blog.heroku.com
blog.heroku.com
I tried out this project with similar aims in the past: https://github.com/rainforestapp/heroku.json but it wasn't quite enough to get an app up and running.
git clone https://github.com/whatever; heroku create; git push heroku master heroku config:set SECRET_TOKEN=`openssl rand -hex 20`
heroku run rake db:migrate
heroku addons:add scheduler
Open the scheduler webpage and add an hourly task
heroku restartMy approach though was having a Chrome extension to add that button on any GitHub repo. Clicking it would create the app, clone it and push it out to your own instance.
Some things slowed me down though. For example the Heroku API doesn't play well with requests made with XMLHttpRequest inside the browser, so I wrote a simple proxy for that purpose. I started working on a Heroku app that would do the git cloning but haven't had much time on it.
With curl, the doc says to use a blank username and the token as password in Basic Auth. When I do that with XMLHttpRequest, the token is completely ignored and the main site's cookie is used. There is no way not to pass the cookie with XMLHttpRequest unfortunately, so I would have to rely on if the user is logged in or not. That would bring other problems: I could only use the API for one account at a time for example, and I would have to add checks to see if the user is logged in, etc.
So my work-around was to write a proxy that would just pass around the requests to Heroku and the response back to the XMLHttpRequest client. (https://github.com/Timothee/Passeplat) With it, I can make the same requests I would make to https://api.heroku.com but instead make them to mypasseplatinstance.heroku.com.
Making this a Heroku-ready app is of course not a coincidence: my plan is to use my Heroku instances (the proxy and the yet-to-be-written git clone) to bootstrap a couple of Heroku instances with the user's own Heroku account. Then the extension would use these to start up other apps. I like the bootstrap idea: it's like compiling a compiler. :)
I'm now realizing that it might even be done with a buildpack… I'd have to look into that. (that would remove the need for that second "git clone" app) Hum, I'll really have to look into that! That could make things much easier and cleaner. (and also cooler)
There would still be the issue of specific configurations and add-ons to deal with, but that shouldn't be too hard if the rest is done.
edit: I haven't checked if this is still a problem with today's announcement. Also, I contacted Heroku support about it, but they only suggested I use a proxy.
To me, the API endpoints should behave the same way in a browser as with curl without ever redirecting to the login page.
But, once again, it might have been fixed in the meantime… I haven't tried recently.
Instead, most companies put the version number in the URL and use special suffixes on the URL like ".json" to indicate these things. I can understand this practice from the standpoint of convenience. A human using cURL can't be bothered to type out an Accept header. But when building an API support should first be considered for explicit, programmatic API clients, not humans. Then you can slap on your human-friendly URL extensions, etc.
It's always easier to start out being explicit.
At Pogoapp we basically reverse-engineered our API from Heroku's command line client, but it's excellent to have Heroku make the API public and formal, because it should make that process much easier and set up Heroku's API as a good target for other PaaS hosts to standardize on (in the same way Ceph & RiakCS have S3-compatible REST APIs)
Can someone explain how this differs from https://github.com/heroku/heroku.rb ?
We did provide a legacy API (v2), the platform API is the next iteration on the design (v3). The legacy API was mostly used just internally and we knew we could do better in providing a great public API for external folks to tie into and use for awesome stuff.
Currently heroku.rb still uses the legacy API, as we did not want to introduce breaking changes to heroku.rb and because the legacy API will still be around for a while. We will build new tools and update existing ones, but plan to do so later in the beta so that we can integrate feedback and see what will best help people.
I find that amazing. I think every app I've ever worked on or built with Heroku has tied into the API in one way or another. It's one of your best features.
There's lots of commercially licensed, self-hosted software (blog, forum, ecommerce etc) and hosted-as-a-service (wordpress.com, discourse.org, duelapp.com etc) etc that would be applicable.
Enabling that by API or in general would be awesome.