<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OlaBerg</id>
	<title>Microformats Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OlaBerg"/>
	<link rel="alternate" type="text/html" href="https://microformats.org/wiki/Special:Contributions/OlaBerg"/>
	<updated>2026-04-24T22:13:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=rest/forms-brainstorming&amp;diff=15705</id>
		<title>rest/forms-brainstorming</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=rest/forms-brainstorming&amp;diff=15705"/>
		<updated>2006-10-09T14:49:39Z</updated>

		<summary type="html">&lt;p&gt;OlaBerg: /* Proposal B: REST-oriented process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Forms Brainstorming =&lt;br /&gt;
&lt;br /&gt;
This page collects ideas from [[forms-examples]] how to best encode form data into a microformat&lt;br /&gt;
&lt;br /&gt;
== Proposal A: DETH - Dictionaries Encoding/Transmitting HTML ==&lt;br /&gt;
&lt;br /&gt;
=== Rules (Strawman) ===&lt;br /&gt;
&lt;br /&gt;
# Only use [http://www.w3.org/TR/xhtml-modularization/abstract_modules.html#s_sformsmodule XHTML Basic Forms] Module&lt;br /&gt;
# Must use action with appropriate URI (no scripts)&lt;br /&gt;
# Recommend: use a ''label'' with every ''input''&lt;br /&gt;
# Make the ''for'' of the ''label'' match the ''id'' of ''input''&lt;br /&gt;
# Group ''label'' with ''input'' using ''&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;lt;dd&amp;gt;''&lt;br /&gt;
# Always place ''submit'' and ''reset'' outside grouping&lt;br /&gt;
&lt;br /&gt;
=== Questions for further research ===&lt;br /&gt;
&lt;br /&gt;
# How to specify whether a field is optional or required?&lt;br /&gt;
&lt;br /&gt;
## Suggestion: the label contains a * ?&lt;br /&gt;
&lt;br /&gt;
=== Patterns ===&lt;br /&gt;
&lt;br /&gt;
==== Anchor Design Pattern ====&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;a class=&amp;quot;deth&amp;quot; href=&amp;quot;http//somesite.com/prog/adduser&amp;quot;&amp;gt;label&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Forms Design Pattern ====&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;form class=&amp;quot;deth&amp;quot; action=&amp;quot;http://somesite.com/users&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;amp;lt;dt&amp;gt;&amp;amp;lt;label for=&amp;quot;firstname&amp;quot;&amp;gt;First name:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;firstname&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
    &amp;amp;lt;label for=&amp;quot;lastname&amp;quot;&amp;gt;Last name:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;lastname&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;Sex&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;sex&amp;quot; value=&amp;quot;male&amp;quot;&amp;gt;Male&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
   &amp;amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;sex&amp;quot; value=&amp;quot;female&amp;quot;&amp;gt;Female&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;Travel&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;  &amp;amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;travel&amp;quot; value=&amp;quot;car&amp;quot;&amp;gt;Car&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
   &amp;amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;travel&amp;quot; value=&amp;quot;bike&amp;quot;&amp;gt;Bicycle&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
  &amp;amp;lt;label for=&amp;quot;age&amp;quot;&amp;gt;Age:&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&lt;br /&gt;
  &amp;amp;lt;select&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=0&amp;gt;&amp;amp;lt; 18&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=18&amp;gt;18-64&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=65&amp;gt;65+&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/select&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
  &amp;amp;lt;label for=&amp;quot;description&amp;quot;&amp;gt;Description:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;textarea id=&amp;quot;description&amp;quot;&amp;gt;Default text&amp;amp;lt;/textarea&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dl&amp;gt;&lt;br /&gt;
 &amp;amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Send&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;input type=&amp;quot;reset&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Python Binding ==&lt;br /&gt;
&lt;br /&gt;
 order=[&lt;br /&gt;
  &amp;quot;firstname&amp;quot;,&amp;quot;lastname&amp;quot;,&amp;quot;sex&amp;quot;,'&amp;quot;travel&amp;quot;, &amp;quot;age&amp;quot;,&amp;quot;description&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 dict={&lt;br /&gt;
  &amp;quot;@@tag&amp;quot;:&amp;quot;form&amp;quot;,&lt;br /&gt;
    &amp;quot;@action&amp;quot;:&amp;quot;http://somesite.com/users/&amp;quot;,&lt;br /&gt;
    &amp;quot;@class&amp;quot;:&amp;quot;deth&amp;quot;,&lt;br /&gt;
    &amp;quot;@enctype&amp;quot;:&amp;quot;application/x-www-form-urlencoded&amp;quot;,&lt;br /&gt;
    &amp;quot;@method&amp;quot;:&amp;quot;post&amp;quot;,&lt;br /&gt;
  &amp;quot;@@order&amp;quot;:order,&lt;br /&gt;
  &amp;quot;firstname&amp;quot;:&amp;quot;First name:&amp;quot;,&lt;br /&gt;
  &amp;quot;lastname&amp;quot;:&amp;quot;Last name:&amp;quot;,&lt;br /&gt;
  &amp;quot;sex&amp;quot;:{&amp;quot;@type&amp;quot;:&amp;quot;radio&amp;quot;, &amp;quot;male&amp;quot;:&amp;quot;Male&amp;quot;, &amp;quot;female&amp;quot;:&amp;quot;Female&amp;quot;},&lt;br /&gt;
  &amp;quot;travel&amp;quot;:{&amp;quot;@type&amp;quot;:&amp;quot;checkbox&amp;quot;, &amp;quot;car&amp;quot;:&amp;quot;Car&amp;quot;, &amp;quot;bike&amp;quot;:&amp;quot;Bicycle&amp;quot;},&lt;br /&gt;
  &amp;quot;age&amp;quot;:{&amp;quot;@@body&amp;quot;:&amp;quot;Age:&amp;quot;, &amp;quot;@type&amp;quot;:&amp;quot;select&amp;quot;,&lt;br /&gt;
         &amp;quot;0&amp;quot;:&amp;quot;&amp;lt; 18&amp;quot;, &amp;quot;18&amp;quot;:&amp;quot;18-64&amp;quot;, &amp;quot;65&amp;quot;:&amp;quot;65+&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
  &amp;quot;description&amp;quot;:{&lt;br /&gt;
    &amp;quot;@@body&amp;quot;:&amp;quot;Description:&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;:&amp;quot;textarea&amp;quot;,&lt;br /&gt;
    &amp;quot;@value&amp;quot;:&amp;quot;Default text&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Proposal B: REST-oriented process ==&lt;br /&gt;
From [Kyle Cordes], for the discovery of the parameters:&lt;br /&gt;
&lt;br /&gt;
* You discover the URL of a service by some means.&lt;br /&gt;
* You GET that URL, which returns an HTML form.&lt;br /&gt;
* The HTML form describes where to POST to invoke that service, and what &lt;br /&gt;
parameters can be passed in that POST.  In some cases, it will use &lt;br /&gt;
&amp;lt;selects&amp;gt;s to describe what options are valid for a parameter.&lt;br /&gt;
* In most cases, the form will be interspersed with human readable text, &lt;br /&gt;
to explain the meaning of the parameters (a machine-understandable way &lt;br /&gt;
to explain parameter meaning, sounds like an AI problem...)&lt;br /&gt;
* You (the user of a web browser, or a piece of software &lt;br /&gt;
programmatically using the server) populate the parameters and POST them &lt;br /&gt;
to the URL you discovered via the form.&lt;br /&gt;
* You get back a response, which might be an error message about a &lt;br /&gt;
parameter problem, or might be a respresentation of the &amp;quot;answer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[OlaBerg] says: This is exactly what I do, and it works great! In fact, I &lt;br /&gt;
use it both for POST-API and GET-API. A set of forms defines a REST-ful&lt;br /&gt;
API.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.opendarwin.org/~drernie/rest-api.html REST self-describing API proposal]&lt;br /&gt;
* [http://opensearch.a9.com/ OpenSearch search results standard (REST-like)]&lt;br /&gt;
* [[rest-brainstorming]]&lt;/div&gt;</summary>
		<author><name>OlaBerg</name></author>
	</entry>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=rest/forms-brainstorming&amp;diff=9348</id>
		<title>rest/forms-brainstorming</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=rest/forms-brainstorming&amp;diff=9348"/>
		<updated>2006-10-09T14:46:38Z</updated>

		<summary type="html">&lt;p&gt;OlaBerg: /* Questions for further research */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Forms Brainstorming =&lt;br /&gt;
&lt;br /&gt;
This page collects ideas from [[forms-examples]] how to best encode form data into a microformat&lt;br /&gt;
&lt;br /&gt;
== Proposal A: DETH - Dictionaries Encoding/Transmitting HTML ==&lt;br /&gt;
&lt;br /&gt;
=== Rules (Strawman) ===&lt;br /&gt;
&lt;br /&gt;
# Only use [http://www.w3.org/TR/xhtml-modularization/abstract_modules.html#s_sformsmodule XHTML Basic Forms] Module&lt;br /&gt;
# Must use action with appropriate URI (no scripts)&lt;br /&gt;
# Recommend: use a ''label'' with every ''input''&lt;br /&gt;
# Make the ''for'' of the ''label'' match the ''id'' of ''input''&lt;br /&gt;
# Group ''label'' with ''input'' using ''&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;lt;dd&amp;gt;''&lt;br /&gt;
# Always place ''submit'' and ''reset'' outside grouping&lt;br /&gt;
&lt;br /&gt;
=== Questions for further research ===&lt;br /&gt;
&lt;br /&gt;
# How to specify whether a field is optional or required?&lt;br /&gt;
&lt;br /&gt;
## Suggestion: the label contains a * ?&lt;br /&gt;
&lt;br /&gt;
=== Patterns ===&lt;br /&gt;
&lt;br /&gt;
==== Anchor Design Pattern ====&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;a class=&amp;quot;deth&amp;quot; href=&amp;quot;http//somesite.com/prog/adduser&amp;quot;&amp;gt;label&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Forms Design Pattern ====&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;form class=&amp;quot;deth&amp;quot; action=&amp;quot;http://somesite.com/users&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;amp;lt;dt&amp;gt;&amp;amp;lt;label for=&amp;quot;firstname&amp;quot;&amp;gt;First name:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;firstname&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
    &amp;amp;lt;label for=&amp;quot;lastname&amp;quot;&amp;gt;Last name:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;lastname&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;Sex&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;sex&amp;quot; value=&amp;quot;male&amp;quot;&amp;gt;Male&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
   &amp;amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;sex&amp;quot; value=&amp;quot;female&amp;quot;&amp;gt;Female&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;Travel&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;  &amp;amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;travel&amp;quot; value=&amp;quot;car&amp;quot;&amp;gt;Car&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
   &amp;amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;travel&amp;quot; value=&amp;quot;bike&amp;quot;&amp;gt;Bicycle&amp;amp;lt;/input&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
  &amp;amp;lt;label for=&amp;quot;age&amp;quot;&amp;gt;Age:&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&lt;br /&gt;
  &amp;amp;lt;select&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=0&amp;gt;&amp;amp;lt; 18&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=18&amp;gt;18-64&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;amp;lt;option val=65&amp;gt;65+&amp;amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/select&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&amp;amp;lt;dt&amp;gt;&lt;br /&gt;
  &amp;amp;lt;label for=&amp;quot;description&amp;quot;&amp;gt;Description:&amp;amp;lt;/label&amp;gt;&amp;amp;lt;/dt&amp;gt;&lt;br /&gt;
   &amp;amp;lt;dd&amp;gt;&amp;amp;lt;textarea id=&amp;quot;description&amp;quot;&amp;gt;Default text&amp;amp;lt;/textarea&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dd&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/dl&amp;gt;&lt;br /&gt;
 &amp;amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Send&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;input type=&amp;quot;reset&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Python Binding ==&lt;br /&gt;
&lt;br /&gt;
 order=[&lt;br /&gt;
  &amp;quot;firstname&amp;quot;,&amp;quot;lastname&amp;quot;,&amp;quot;sex&amp;quot;,'&amp;quot;travel&amp;quot;, &amp;quot;age&amp;quot;,&amp;quot;description&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 dict={&lt;br /&gt;
  &amp;quot;@@tag&amp;quot;:&amp;quot;form&amp;quot;,&lt;br /&gt;
    &amp;quot;@action&amp;quot;:&amp;quot;http://somesite.com/users/&amp;quot;,&lt;br /&gt;
    &amp;quot;@class&amp;quot;:&amp;quot;deth&amp;quot;,&lt;br /&gt;
    &amp;quot;@enctype&amp;quot;:&amp;quot;application/x-www-form-urlencoded&amp;quot;,&lt;br /&gt;
    &amp;quot;@method&amp;quot;:&amp;quot;post&amp;quot;,&lt;br /&gt;
  &amp;quot;@@order&amp;quot;:order,&lt;br /&gt;
  &amp;quot;firstname&amp;quot;:&amp;quot;First name:&amp;quot;,&lt;br /&gt;
  &amp;quot;lastname&amp;quot;:&amp;quot;Last name:&amp;quot;,&lt;br /&gt;
  &amp;quot;sex&amp;quot;:{&amp;quot;@type&amp;quot;:&amp;quot;radio&amp;quot;, &amp;quot;male&amp;quot;:&amp;quot;Male&amp;quot;, &amp;quot;female&amp;quot;:&amp;quot;Female&amp;quot;},&lt;br /&gt;
  &amp;quot;travel&amp;quot;:{&amp;quot;@type&amp;quot;:&amp;quot;checkbox&amp;quot;, &amp;quot;car&amp;quot;:&amp;quot;Car&amp;quot;, &amp;quot;bike&amp;quot;:&amp;quot;Bicycle&amp;quot;},&lt;br /&gt;
  &amp;quot;age&amp;quot;:{&amp;quot;@@body&amp;quot;:&amp;quot;Age:&amp;quot;, &amp;quot;@type&amp;quot;:&amp;quot;select&amp;quot;,&lt;br /&gt;
         &amp;quot;0&amp;quot;:&amp;quot;&amp;lt; 18&amp;quot;, &amp;quot;18&amp;quot;:&amp;quot;18-64&amp;quot;, &amp;quot;65&amp;quot;:&amp;quot;65+&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
  &amp;quot;description&amp;quot;:{&lt;br /&gt;
    &amp;quot;@@body&amp;quot;:&amp;quot;Description:&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;:&amp;quot;textarea&amp;quot;,&lt;br /&gt;
    &amp;quot;@value&amp;quot;:&amp;quot;Default text&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Proposal B: REST-oriented process ==&lt;br /&gt;
From [Kyle Cordes], for the discovery of the parameters:&lt;br /&gt;
&lt;br /&gt;
* You discover the URL of a service by some means.&lt;br /&gt;
* You GET that URL, which returns an HTML form.&lt;br /&gt;
* The HTML form describes where to POST to invoke that service, and what &lt;br /&gt;
parameters can be passed in that POST.  In some cases, it will use &lt;br /&gt;
&amp;lt;selects&amp;gt;s to describe what options are valid for a parameter.&lt;br /&gt;
* In most cases, the form will be interspersed with human readable text, &lt;br /&gt;
to explain the meaning of the parameters (a machine-understandable way &lt;br /&gt;
to explain parameter meaning, sounds like an AI problem...)&lt;br /&gt;
* You (the user of a web browser, or a piece of software &lt;br /&gt;
programmatically using the server) populate the parameters and POST them &lt;br /&gt;
to the URL you discovered via the form.&lt;br /&gt;
* You get back a response, which might be an error message about a &lt;br /&gt;
parameter problem, or might be a respresentation of the &amp;quot;answer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.opendarwin.org/~drernie/rest-api.html REST self-describing API proposal]&lt;br /&gt;
* [http://opensearch.a9.com/ OpenSearch search results standard (REST-like)]&lt;br /&gt;
* [[rest-brainstorming]]&lt;/div&gt;</summary>
		<author><name>OlaBerg</name></author>
	</entry>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=rest/brainstorming&amp;diff=12422</id>
		<title>rest/brainstorming</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=rest/brainstorming&amp;diff=12422"/>
		<updated>2006-10-09T14:13:58Z</updated>

		<summary type="html">&lt;p&gt;OlaBerg: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= XHTML-REST Brainstorming =&lt;br /&gt;
&lt;br /&gt;
This page collects ideas from [[rest-examples]] how to best encode [[REST]] data in an XHTML microformat.&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
&lt;br /&gt;
The underlying premise of this investigation is that REST is less useful that it could be due to concerns about a) interoperability, and b) discoverability.   To address this, we propose adopting microformat-style conventions to further constrain the ways REST already constrains web services.&lt;br /&gt;
&lt;br /&gt;
In particular, we constrain REST to work with existing web browser clients -- yet also be machine-parseable.   This means:&lt;br /&gt;
* All inputs must be url-encoded (or maybe mime/multipart)&lt;br /&gt;
* All output must be XHTML, either:&lt;br /&gt;
** XOXO: [[xoxo]] (dl, ul, ol)&lt;br /&gt;
** XOXT: [[table-brainstorms]] (table-th-tr-td)&lt;br /&gt;
* All URI links must be encoded as either:&lt;br /&gt;
** Anchors (&amp;amp;lt;a&amp;amp;rt;) (via 'href')&lt;br /&gt;
** Forms (&amp;amp;lt;a&amp;amp;rt;) (via 'action')&lt;br /&gt;
* Only GET and POST actions are supported&lt;br /&gt;
&lt;br /&gt;
This may seem  very strict, but that's the point: by adding more constraints, we reduce gratuitous degrees of freedom and enable greater consistency.&lt;br /&gt;
&lt;br /&gt;
This may not solve every conceivable problem, but it should handle the 50% case pretty well:&lt;br /&gt;
* REST: 80% of web services&lt;br /&gt;
* XHTML: 80% of XML expressiveness&lt;br /&gt;
* GET/POST + urlencoding: 80% of queries&lt;br /&gt;
or, put another way:&lt;br /&gt;
* 80% x 80% x 80% = 51.2% of the benefit for&lt;br /&gt;
* 20% x 20% x 20% = 0.8% of the effort &lt;br /&gt;
&lt;br /&gt;
== Conventions ==&lt;br /&gt;
&lt;br /&gt;
To make parsing and auto-discovery easier -- and also simplify the design process -- we propose the following additional conventions.&lt;br /&gt;
&lt;br /&gt;
=== Nouns ===&lt;br /&gt;
&lt;br /&gt;
As usual in REST, every ''noun'' must be a URI.   However, we explicitly define three types of URIs:&lt;br /&gt;
;base:The base URI for the web service, e.g.: &amp;lt;code&amp;gt;http://example.com/site/&amp;lt;/code&amp;gt;.&lt;br /&gt;
;records:URIs representing individual entities, e.g.: &amp;lt;code&amp;gt;http://example.com/webservice/users/me%40drernie.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
;tables:The URIs used to create or search for those instances, e.g.: &amp;lt;code&amp;gt;http://example.com/webservice/users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that each record is defined by a set of key-value pairs living under that table.&lt;br /&gt;
&lt;br /&gt;
There can also be 'singletons' - a class which only has a single instance.&lt;br /&gt;
&lt;br /&gt;
=== Verbs ===&lt;br /&gt;
&lt;br /&gt;
REST depends on using verbs properly. Your typical verbs are POST (create), GET (retrieve), PUT (update), and DELETE (delete). More verbs can be defined and used, but the listed above are most commonly used and supported.&lt;br /&gt;
&lt;br /&gt;
As we know, HTML forms spec (and therefore commonly used UAs) only provides support for POST and GET verbs. This limitation has been the biggest argument against mixing HTML and REST: tunnelling of PUT and DELETE verbs through POST (or even worse, GET) creates architectural unREST.&lt;br /&gt;
&lt;br /&gt;
However, some architectures simply do not need deletion and update operations. Using HTML with REST requires employing such architectures.&lt;br /&gt;
&lt;br /&gt;
While that may seem overly restrictive, as a practical matter those cover the &amp;quot;80%&amp;quot; of public web services we are trying to solve (after all, you are welcome to use your own private methods if you need to).&lt;br /&gt;
&lt;br /&gt;
Even better, we can define very precise semantics for what GET &amp;amp; POST mean for each of the different nouns:&lt;br /&gt;
&lt;br /&gt;
 GET base&lt;br /&gt;
 GET base?view=api # Return hyperlinks and forms&lt;br /&gt;
 GET base?query   # search for records across multiple table&lt;br /&gt;
&lt;br /&gt;
 GET table&lt;br /&gt;
 GET table?view=api&lt;br /&gt;
 GET table?query  # search for records in that table&lt;br /&gt;
 POST table?create # create record&lt;br /&gt;
&lt;br /&gt;
 GET record # encode as xoxo&lt;br /&gt;
 GET record?view=edit # encode as hyperlinks/anchors&lt;br /&gt;
 GET record?view=api # encode as hyperlinks/anchors + descriptions&lt;br /&gt;
 POST record?update # update record -- this is tunnelling, a no-no&lt;br /&gt;
&lt;br /&gt;
For simplicity, we assume:&lt;br /&gt;
* users can not delete anything&lt;br /&gt;
* users can not create tables (or singletons)&lt;br /&gt;
&lt;br /&gt;
To be sure, there are natural ways to extend this protocol to provide that functionality.  However, as that is primarly for admin usage, and thus a private API, we're glossing over it here.  From a user's point of view, we provide analogous capabilities using POST:&lt;br /&gt;
* &amp;quot;DELETE&amp;quot; is replaced by &amp;quot;mark for deletion&amp;quot;&lt;br /&gt;
* &amp;quot;PUT&amp;quot; is replaced by &amp;quot;ask table to create record&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
&lt;br /&gt;
Results should be returned in a xoxo-compatible format.  In particular, query results should leverage &lt;br /&gt;
[http://opensearch.a9.com/spec/opensearchresponse/1.1/ OpenSearch 1.1]. &lt;br /&gt;
&lt;br /&gt;
[''Do HTML bindings for this already exist?'']&lt;br /&gt;
&lt;br /&gt;
== Questions for further research ==&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
&lt;br /&gt;
=== Anchor Design Pattern ===&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;a class=&amp;quot;rest&amp;quot; href=&amp;quot;http//somesite.com/prog/adduser&amp;quot;&amp;gt;label&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forms Design Pattern ===&lt;br /&gt;
&lt;br /&gt;
I use a number of &amp;lt;form&amp;gt;s to declare the API for a web resource:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;function&amp;quot;&amp;gt;&lt;br /&gt;
The visual human name in h1-tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Foobalize&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A human readable explanation using in some html.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Foobalizer foobalizes grunts and glomph. Note that blorks already must be gazzed!&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then the form that specifies one function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form id=&amp;quot;fooblize&amp;quot; action=&amp;quot;GET&amp;quot; action=&amp;quot;http://www.example.com/glurt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;field&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;grunt&amp;quot;&amp;gt;Grunt&amp;lt;/label&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;varchar(20)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;field&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;grunt&amp;quot;&amp;gt;Blork&amp;lt;/label&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;int4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Foobalize&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.opendarwin.org/~drernie/rest-api.html REST self-describing API proposal]&lt;br /&gt;
* [http://opensearch.a9.com/ OpenSearch search results standard (REST-like)]&lt;br /&gt;
* [[rest-proposal-preso]]&lt;br /&gt;
* [[duhper-proposal-preso]]&lt;br /&gt;
&lt;br /&gt;
[http://www.opendarwin.org/~drernie/rest-api.html Proposed REST API]&lt;/div&gt;</summary>
		<author><name>OlaBerg</name></author>
	</entry>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=rest/brainstorming&amp;diff=9346</id>
		<title>rest/brainstorming</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=rest/brainstorming&amp;diff=9346"/>
		<updated>2006-10-09T14:11:49Z</updated>

		<summary type="html">&lt;p&gt;OlaBerg: /* Forms Design Pattern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= XHTML-REST Brainstorming =&lt;br /&gt;
&lt;br /&gt;
This page collects ideas from [[rest-examples]] how to best encode [[REST]] data in an XHTML microformat.&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
&lt;br /&gt;
The underlying premise of this investigation is that REST is less useful that it could be due to concerns about a) interoperability, and b) discoverability.   To address this, we propose adopting microformat-style conventions to further constrain the ways REST already constrains web services.&lt;br /&gt;
&lt;br /&gt;
In particular, we constrain REST to work with existing web browser clients -- yet also be machine-parseable.   This means:&lt;br /&gt;
* All inputs must be url-encoded (or maybe mime/multipart)&lt;br /&gt;
* All output must be XHTML, either:&lt;br /&gt;
** XOXO: [[xoxo]] (dl, ul, ol)&lt;br /&gt;
** XOXT: [[table-brainstorms]] (table-th-tr-td)&lt;br /&gt;
* All URI links must be encoded as either:&lt;br /&gt;
** Anchors (&amp;amp;lt;a&amp;amp;rt;) (via 'href')&lt;br /&gt;
** Forms (&amp;amp;lt;a&amp;amp;rt;) (via 'action')&lt;br /&gt;
* Only GET and POST actions are supported&lt;br /&gt;
&lt;br /&gt;
This may seem  very strict, but that's the point: by adding more constraints, we reduce gratuitous degrees of freedom and enable greater consistency.&lt;br /&gt;
&lt;br /&gt;
This may not solve every conceivable problem, but it should handle the 50% case pretty well:&lt;br /&gt;
* REST: 80% of web services&lt;br /&gt;
* XHTML: 80% of XML expressiveness&lt;br /&gt;
* GET/POST + urlencoding: 80% of queries&lt;br /&gt;
or, put another way:&lt;br /&gt;
* 80% x 80% x 80% = 51.2% of the benefit for&lt;br /&gt;
* 20% x 20% x 20% = 0.8% of the effort &lt;br /&gt;
&lt;br /&gt;
== Conventions ==&lt;br /&gt;
&lt;br /&gt;
To make parsing and auto-discovery easier -- and also simplify the design process -- we propose the following additional conventions.&lt;br /&gt;
&lt;br /&gt;
=== Nouns ===&lt;br /&gt;
&lt;br /&gt;
As usual in REST, every ''noun'' must be a URI.   However, we explicitly define three types of URIs:&lt;br /&gt;
;base:The base URI for the web service, e.g.: &amp;lt;code&amp;gt;http://example.com/site/&amp;lt;/code&amp;gt;.&lt;br /&gt;
;records:URIs representing individual entities, e.g.: &amp;lt;code&amp;gt;http://example.com/webservice/users/me%40drernie.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
;tables:The URIs used to create or search for those instances, e.g.: &amp;lt;code&amp;gt;http://example.com/webservice/users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that each record is defined by a set of key-value pairs living under that table.&lt;br /&gt;
&lt;br /&gt;
There can also be 'singletons' - a class which only has a single instance.&lt;br /&gt;
&lt;br /&gt;
=== Verbs ===&lt;br /&gt;
&lt;br /&gt;
REST depends on using verbs properly. Your typical verbs are POST (create), GET (retrieve), PUT (update), and DELETE (delete). More verbs can be defined and used, but the listed above are most commonly used and supported.&lt;br /&gt;
&lt;br /&gt;
As we know, HTML forms spec (and therefore commonly used UAs) only provides support for POST and GET verbs. This limitation has been the biggest argument against mixing HTML and REST: tunnelling of PUT and DELETE verbs through POST (or even worse, GET) creates architectural unREST.&lt;br /&gt;
&lt;br /&gt;
However, some architectures simply do not need deletion and update operations. Using HTML with REST requires employing such architectures.&lt;br /&gt;
&lt;br /&gt;
While that may seem overly restrictive, as a practical matter those cover the &amp;quot;80%&amp;quot; of public web services we are trying to solve (after all, you are welcome to use your own private methods if you need to).&lt;br /&gt;
&lt;br /&gt;
Even better, we can define very precise semantics for what GET &amp;amp; POST mean for each of the different nouns:&lt;br /&gt;
&lt;br /&gt;
 GET base&lt;br /&gt;
 GET base?view=api # Return hyperlinks and forms&lt;br /&gt;
 GET base?query   # search for records across multiple table&lt;br /&gt;
&lt;br /&gt;
 GET table&lt;br /&gt;
 GET table?view=api&lt;br /&gt;
 GET table?query  # search for records in that table&lt;br /&gt;
 POST table?create # create record&lt;br /&gt;
&lt;br /&gt;
 GET record # encode as xoxo&lt;br /&gt;
 GET record?view=edit # encode as hyperlinks/anchors&lt;br /&gt;
 GET record?view=api # encode as hyperlinks/anchors + descriptions&lt;br /&gt;
 POST record?update # update record -- this is tunnelling, a no-no&lt;br /&gt;
&lt;br /&gt;
For simplicity, we assume:&lt;br /&gt;
* users can not delete anything&lt;br /&gt;
* users can not create tables (or singletons)&lt;br /&gt;
&lt;br /&gt;
To be sure, there are natural ways to extend this protocol to provide that functionality.  However, as that is primarly for admin usage, and thus a private API, we're glossing over it here.  From a user's point of view, we provide analogous capabilities using POST:&lt;br /&gt;
* &amp;quot;DELETE&amp;quot; is replaced by &amp;quot;mark for deletion&amp;quot;&lt;br /&gt;
* &amp;quot;PUT&amp;quot; is replaced by &amp;quot;ask table to create record&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
&lt;br /&gt;
Results should be returned in a xoxo-compatible format.  In particular, query results should leverage &lt;br /&gt;
[http://opensearch.a9.com/spec/opensearchresponse/1.1/ OpenSearch 1.1]. &lt;br /&gt;
&lt;br /&gt;
[''Do HTML bindings for this already exist?'']&lt;br /&gt;
&lt;br /&gt;
== Questions for further research ==&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
&lt;br /&gt;
=== Anchor Design Pattern ===&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;a class=&amp;quot;rest&amp;quot; href=&amp;quot;http//somesite.com/prog/adduser&amp;quot;&amp;gt;label&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forms Design Pattern ===&lt;br /&gt;
&lt;br /&gt;
I use a number of &amp;lt;form&amp;gt;s to declare the API for a web resource:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;function&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Foobalize&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Foobalizer foobalizes grunts and glomph. Note that blorks already must be gazzed!&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;GET&amp;quot; action=&amp;quot;http://www.example.com/glurt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;field&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;grunt&amp;quot;&amp;gt;Grunt&amp;lt;/label&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;varchar(20)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;field&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;grunt&amp;quot;&amp;gt;Blork&amp;lt;/label&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;int4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Foobalize&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.opendarwin.org/~drernie/rest-api.html REST self-describing API proposal]&lt;br /&gt;
* [http://opensearch.a9.com/ OpenSearch search results standard (REST-like)]&lt;br /&gt;
* [[rest-proposal-preso]]&lt;br /&gt;
* [[duhper-proposal-preso]]&lt;br /&gt;
&lt;br /&gt;
[http://www.opendarwin.org/~drernie/rest-api.html Proposed REST API]&lt;/div&gt;</summary>
		<author><name>OlaBerg</name></author>
	</entry>
</feed>