16

I'm pretty new to javascript and am working on an embedded system which decodes video over IP.

I have written a small app for setting up and changing channels using javascript and included a key handler for remote controls and an event handler so I can take some action or present a message if video stops or the network goes down, but now I also want to set up an automatic HTTP POST that gets sent when I change channel to include some data about the device and the url currently being played.

This is a small embedded hardware device running busybox, so I can't use Ajax or add any other normal web technologies, I just need to use Javascript to send a HTTP POST triggered by events I am monitoring, so my first goal is to be able to press a button and send that POST message then work out when to trigger it later.

Anyone familiar with doing such things that can give me a quick overview of how to send a post to a known listening device/location and include data in it?

Many thanks

Andy Henry
  • 163
  • 1
  • 1
  • 4
  • What is your Javascript engine/runtime? Do you have XMLHttpRequest support? The two major javascript environments I'm familiar with are Javascript in the browser and node.js. The former utilizes XMLHttpRequest to send HTTP messages. The later uses the specialized node.js support libraries. Each provides a very simple transmit API. – Will Nelson Feb 14 '13 at 11:16
  • Hi Will, Yes we have XMLHttpRequest support. – Andy Henry Feb 14 '13 at 11:26

1 Answers1

41

This is easy if your Javascript engine supports XMLHttpRequest (XHR), which is ubiquitous on the web. Google it or see this page for details. I've provided a code snippet below. Read it carefully, particularly the comments on "async" being true and closures in response handlers. Also, this code is super lightweight as far as Javascript goes and I would expect it would work fine on just about any contemporary hardware footprint.

var url = "http://www.google.com/";
var method = "POST";
var postData = "Some data";

// You REALLY want shouldBeAsync = true.
// Otherwise, it'll block ALL execution waiting for server response.
var shouldBeAsync = true;

var request = new XMLHttpRequest();

// Before we send anything, we first have to say what we will do when the
// server responds. This seems backwards (say how we'll respond before we send
// the request? huh?), but that's how Javascript works.
// This function attached to the XMLHttpRequest "onload" property specifies how
// the HTTP response will be handled. 
request.onload = function () {

   // Because of javascript's fabulous closure concept, the XMLHttpRequest "request"
   // object declared above is available in this function even though this function
   // executes long after the request is sent and long after this function is
   // instantiated. This fact is CRUCIAL to the workings of XHR in ordinary
   // applications.

   // You can get all kinds of information about the HTTP response.
   var status = request.status; // HTTP response status, e.g., 200 for "200 OK"
   var data = request.responseText; // Returned data, e.g., an HTML document.
}

request.open(method, url, shouldBeAsync);

request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
// Or... request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
// Or... whatever

// Actually sends the request to the server.
request.send(postData);
Wilco Bakker
  • 527
  • 1
  • 7
  • 18
Will Nelson
  • 966
  • 8
  • 13
  • 3
    I am using node.js, and this worked for me after adding the following line before var request = new XMLHttpRequest(); var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; you may also want to install XMLHttpRequest $ npm install xmlhttprequest – saad Aug 23 '13 at 08:37