YUI 3: IO

YUI io is a communication utility that enables HTTP requests while maintaining a persistent client UI, for the purpose of data retrieval and content update. It uses the XMLHttpRequest object for making "same-domain" requests, and it can make cross-domain requests, when instructed to do so, using alternate transports.

Getting Started

Include Dependencies

To use the IO Utility, include the YUI seed file:

NOTE: Cross-domain transactions with io require the use of io.swf. Make sure this dependency is deployed and accessible by io.js.

A Simple Transaction

io() is the primary method for making an HTTP request. This method accepts two arguments: uri and the configuration object.

  • uri: This parameter specifies the URI for the transaction
  • configuration: This parameter is an object of keys and values of configurations specific to the transaction. Please see: The Configuration Object for more information on all available configuration properties.

YUI.io returns an object with the following members:

  • id: This is the unique identifier of the transaction.
  • abort(): Aborts the specific transaction.
  • isInProgress(): Returns a boolean value indicating whether the transaction has completed.

This is an example GET transaction, handling the response at the earliest opportunity.

Using io

This section describes how to use the IO Utility in further detail. It contains these subsections:

The io modules

Beginning with PR2, io's core and supplementary features are split into a base module and sub-modules, to allow greater flexibility in selecting the desired features.

Module Description
io-base This is the io base class, containing the basic functionality needed for making HTTP requests.
io-xdr This sub-module extends io-base, to add cross-domain request capabilities using alternate HTTP transports.
io-form This sub-module extends io-base, to add the ability to serialize HTML form data for POST transactions.
io-upload-iframe This sub-module extends io-base, to allow file uploads with an HTML form, using an iframe as the transaction transport.
io-queue This sub-module extends io-base, to provide a basic queue interface for io.

The Configuration Object

This object is the second argument of io(). Its properties define transaction parameters and transaction response handling. The configuration object and all configuration properties are optional. The following table describes all configuration properties used by io.

Property Description
method (string) Defines the HTTP method for the transaction. If this property is undefined or omitted, the default value is GET.
data (string) Data to be sent with HTTP GET and POST transactions. Data are sent as a string of key-value pairs (e.g., "foo=bar&baz=boo").
headers (object) Specific HTTP headers and values to be sent with the transaction (e.g., { 'Content-Type': 'application/xml; charset=utf-8' } ).
on (object) This object defines the events and event handlers to be used for the transaction. These events fire in addition to the global io events. Define as many events as desired for the transaction; all events handlers are optional.
  • start: event handler
  • complete: event handler
  • success: event handler
  • failure: event handler
  • end: event handler
NOTE: These events are accessible only to the transaction's subscribers, whereas global io events are accessible by all subscribers.
context Defines the execution context of the event handler functions for the transaction. If undefined, a default value of window is used.
form (object) This object instructs io to use the labels and values of the specified HTML form as data.
  • id: This property can be defined as the id(String) of an HTML form or an object reference of the HTML form.
  • useDisabled: When set to true, disabled field values are included as data. The default value is false.
xdr (object) Defines the transport to be used for cross-domain requests (e.g., { use:'flash' } ). The transaction will use the specified transport instead of XMLHttpRequest, when specified in the transaction's configuration object.
  • use: This property specifies the type of transport to be used. The possible values are: 'native' and 'flash'.
  • dataType: When set to 'xml', io will return the response data as an XML document, if necessary.
arguments (object)

Object, array, string, or number passed to all registered, transaction event handlers. This value is available as the second argument in the "start" and "end" event handlers; and, it is the third argument in the "complete", "success", and "failure" event handlers.

timeout This value, defined as milliseconds, is a time threshold for the transaction (e.g., { timeout: 2000 } ). When this limit is reached, and the transaction's Complete event has not yet fired, the transaction will be aborted.

This is an example of a configuration object, with a set of properties defined.

The Response Object

When a transaction, using the XHR object as a transport, is complete, the response data are passed as an object to the event handler.

Field Description
status The HTTP status code of the transaction.
statusText The HTTP status message.
getResponseHeader(headername) Returns the string value of the specified header label.
getAllResponseHeaders All response HTTP headers are available as a string. Each key-value pair is delimited by "\n".
responseText The response data as a decoded string.
responseXML The response data as an XML document.

NOTE: Transactions involving file upload or cross-domain requests, using alternate transports, only populate the responseText or responseXML field. The HTTP status and response headers are either inaccessible or unavailable to these alternate transports.

Events

YUI io events provide access to state and data during a transaction's lifecycle. There are two aspects to io events: global and transaction. Global events are always fired by io for all transactions, and these events are accessible to all event subscribers. Transaction events are created and fired only if they are defined in the configuration object. Global events are identified by the io:eventname pattern. The following example describes the event subscription syntax for global events:

The following table describes the available io events:

Event Description
io:start

Fires when a request is made to a resource. The event handler's arguments signature is:

io:complete

Fires after "io:start", when the transaction is complete and response data are available. This is the earliest opportunity to access any response data. The event handler's arguments signature is:

io:success

Fires after the "complete" event, when the response HTTP status resolves to 2xx. The event handler's arguments signature is:

io:failure

Fires after the "complete" event, when the response HTTP status resolves to 4xx. 5xx, undefined, or a non-standard HTTP status. This event also includes 'abort' and 'timeout' conditions. The event handler's arguments signature is:

io:end

Fires at the conclusion of a transaction, after "success" or "failure" has been determined.. The event handler's arguments signature is:

io:xdrReady Fires when the flash XDR transport is ready for use. This event only fires once, when the transport initialization is complete.

The following example demonstrates an io transaction with an event handler subscribed to "io:complete".

Cross-Domain Transactions

By default, io uses the XMLHttpRequest object as the transport for HTTP transactions. It can also be configured to use an alternate transport to make cross-domain, HTTP transactions. Currently, io can make use of Flash as one of two alternate transports. To prepare io for Flash-based, cross-domain transactions, the transport io.swf must be deployed and accessible to YUI io. For each transaction, the configuration object's xdr object must be defined as { use: 'flash' } so io will use the designated transport (instead of using the default transport of XMLHttpRequest).

As io.swf is written in ActionScript 3, Flash Player 9 or better is required (version 9.0.124 or better is recommended). Additionally, a cross-domain policy file must be deployed at the resource to grant the client access to the remote domain. A cross-domain request will not be successful without this policy file hosted at the resource. The following example file grants permissive access to the host from all requests, but the host will only accept custom HTTP headers originating from yahoo.com.

For more information on cross-domain policy file specifications, see the following articles at Adobe Developer Connection.

The following example demonstrates a cross-domain transaction, starting with the initialization of the XDR transport and subscribing to three global io events.

Note: XDR transactions do not fire the global io:complete event and the transaction-specific complete event, when using the Flash transport. All other events in the transaction lifecycle are fired.

A subset of A-grade browsers are capable of making cross-domain requests, using XMLHttpRequest, requiring specific access control headers be served from the resource. To use this feature, the xdr object must be defined with: { use: 'native' }. YUI io will try to resolve the request using the native transport, and it will fall back to the Flash transport if the initial attempt throws an exception due to the browser lacking native support.

NOTE: For native cross-domain requests to work, the resource must respond with the "Access-Control-Allow-Origin" header with a value permitting the client to make the request. In the absence of these HTTP response headers, the transaction will always fail. Please see the following articles for more information on this topic.

Serializing HTML Form as Data

YUI io can serialize HTML form fields into a string of UTF-8 encoded, name-value pairs. If the transaction is HTTP GET, the data are appended to the URI as a querystring. If the transaction if HTTP POST, the data will be the POST message.

Uploading Files in an HTML Form

The default XHR transport, used in io, cannot upload HTML form data that include elements of type="file". In this situation, io will use an alternate transport -- an iframe -- to facilitate the transaction. The following example shows how to configure a transaction involving file upload:

When performing file upload transactions, a subset of global and transaction events will be fired. Specifically, these are:

  • Start
  • Complete
  • End

Success and Failure events are not processed and fired because the iframe transport does not provide access to the HTTP status and response headers, to reliably determine those conditions.

Setting HTTP Headers

The io utility can be configure to send default, custom HTTP Headers for all transactions, in addition to any headers defined in the configuration object. Headers can be set or removed as needed. The following example shows how to set and how to delete default headers in io:

Custom HTTP headers may or may not be sent in cross domain requests. This is may be due to limitations of the transport, or specific "Access-Control" headers requirement.

Queue

YUI io's queue implements YUI Queue to provide sychronous, transaction response. Specifically, transactions are handled -- by global or transaction event handlers -- in the order they are sent, regardless of actual server response order. Transactions can be promoted to the front of the queue, or they can be purged from the queue, as well.

Field Description
queue(uri, configuration) Method signature is identical to io, but returns the id of the transaction.
queue.start() Activates the queue, and begins processing transactions in the queue. This is the default state of the queue.
queue.stop() Deactivates the queue. Transactions sent to queue() will be stored until the queue is re-started.
queue.promote(id) Moves the specified transaction stored in the queue to the head of the queue.
queue.remove(id) Deletes the specified transaction stored in the queue.

Known Issues

  • IE will fail to fire the event io:xdrReady if the page is manually reloaded. A timestamp querystring is added to io.swf, in the XDR example, to correct this condition.
  • Multiple HTML Submit buttons, in an HTML form, are not supported.

Support & Community

Forums & Blog

YUI 3 discussion forums are hosted on YUILibrary.com.

In addition, please visit the YUIBlog for updates and articles about the YUI Library written by the library's developers.

Filing Bugs & Feature Requests

The YUI Library's public bug tracking and feature request repositories are located on the YUILibrary.com site. Before filing new feature requests or bug reports, please review our reporting guidelines.

Copyright © 2009 Yahoo! Inc. All rights reserved. Copyright | Privacy Policy | Terms of Use | Job Openings