GET and POST

In an earlier article, we looked at creating a generic "NetOp" script and a specialised "NetOp.Preloader" script that would extend this. In this tutorial, we will create a "NetOp.Transaction" script to send information to (and get responses from) a server using METHOD-GET or METHOD-POST type transactions.

Here is the "NetOp.Transaction" script. If you pass a 'data' parameter (a property list), it will use the POST method. If this parameter is not provided, it assumes that the data is encoded in the URL string and will use GET.

-- "NetOp.transaction" Parent Script (v.1)


property ancestor 
property NetID
property URL, FORMDATA

on new (me, netAddress, data)
  me.URL = netAddress
  me.FORMDATA = data
  ancestor = script("NetOp").rawNew()
  callAncestor(#new, me)
  return me
end

on Start (me)
  if voidP(FORMDATA) then me.NetID = getNetText(me.URL )
  else  me.NetID = postNetText(me.URL , me.FORMDATA)
  aTimerObj = timeout(me.string).new(100, #Timer_CheckProgress, me)
  return me.NetID
end

on Destroy (me)
  netAbort(me.NetID)
  me.NetID = VOID
  callAncestor(#Destroy, me)
end

on Timer_CheckProgress (me, aTimer)
  if voidP(me.NetID) then
    -- we have aborted the operation
    atimer.forget()
    return 0
  end if
  
  finished = netDone(me.NetID)
  if finished then
    errorNum = netError(me.NetID)
    theText = netTextResult(me.NetID)
    if stringP(errorNum) then errorNum =0
    aTimer.forget()
    me.GenerateEventMessage(#NetTransactionComplete, \
[#Text: theText, #Error: errorNum])
  else
    -- check the current status 
    status = getStreamStatus(me.NetID)
    currentState = status.state
    -- before sending the status, work out the portion downloaded
    case (currentState) of 
      "InProgress":
        if status.bytesSoFar > 0 then 
          if status.bytesTotal > 0 then 
            f = MIN(1.0, float(status.bytesSoFar)/status.bytesTotal )
          else f = .50
        else
          f = 0
        end if
      "Complete":
        f = 1.00
      otherwise
        f = 0
    end case
    -- add the fractionDone as a property to the statusList
    status.addProp( #fractiondone, f )
    -- inform the callback object of the current state and the % transferred
    me.GenerateEventMessage(#NetTransactionStatusUpdate, status)
  end if
end

You may notice that the network operation doesn't actually start until you call the start method of the object. The reason for this is that you might want to track all your network operations and only allow 4 (or so) to run concurrently. In this demo movie, every time you click a 'test' button, a new netOp object is created. If there are less than four operations still active, the netOp object is added to a 'queue' list. When an operation is finished, it is removed from the 'active' list and the netop is chosen from the queue and started.

Demo Movie

In the demo movie above, the page that the shockwave movie is transacting with is a simple PHP script that looks like this:

PHP EXAMPLE
if (isset($_REQUEST['q'])) $q = $_REQUEST['q'];
else $q = "NOT SET";
print "Hi, this is the server speaking. The value I received was $q";

If you are running JSP, the following will achieve the same result (try setting the URL in the above example to http://dev3.medialight.com.au/examples/list2.jsp):

JSP EXAMPLE
String q = request.getParameter("q");
if  (q==null) { q = "NOT SET";}
out.print("Hi, this is the server speaking. The value I received was " + q);

And if you're running ASP.NET or mono, the following will achieve the same result.

.NET/Mono C# Example

void Page_Load (object o, EventArgs e) {
  string q = "NOT SET";
  if (Request.Form["q"] != null ) q = Request.Form["q"];
  else if (Request.QueryString["q"] != null) q = Request.QueryString["q"];
  Response.Write("Hi, this is the .NET server speaking. 
  The value I received was " +q);
}

Source Movie

Last updated 20th of August, 2005

© 2006 MeccaMedialight. Site Powered by Wrangler 8.