Class EncoderRegistry
- java.lang.Object
-
- groovyx.net.http.EncoderRegistry
-
public class EncoderRegistry extends Object implements Iterable<Map.Entry<String,groovy.lang.Closure>>
This class handles creation of the request body (i.e. for a PUT or POST operation) based on content-type. When a
bodyis set from the builder, it is processed based on therequest content-type. For instance, theencodeForm(Map)method will be invoked if the request content-type is form-urlencoded, which will cause the following:body=[a:1, b:'two']to be encoded as the equivalenta=1&b=twoin the request body.Most default encoders can handle a closure as a request body. In this case, the closure is executed and a suitable 'builder' passed to the closure that is used for constructing the content. In the case of binary encoding this would be an OutputStream; for TEXT encoding it would be a PrintWriter, and for XML it would be an already-bound
StreamingMarkupBuilder. See eachencode...method for details for each particular content-type.Contrary to its name, this class does not have anything to do with the
content-encodingHTTP header.
-
-
Constructor Summary
Constructors Constructor Description EncoderRegistry()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected Map<String,groovy.lang.Closure>buildDefaultEncoderMap()Returns a map of default encoders.protected org.apache.http.entity.StringEntitycreateEntity(Object ct, String data)Helper method used by encoder methods to create anHttpEntityinstance that encapsulates the request data.org.apache.http.HttpEntityencodeForm(String formData, Object contentType)Accepts a String as a url-encoded form post.org.apache.http.client.entity.UrlEncodedFormEntityencodeForm(Map<?,?> params)Set the request body as a url-encoded list of parameters.org.apache.http.client.entity.UrlEncodedFormEntityencodeForm(Map<?,?> params, Object contentType)org.apache.http.HttpEntityencodeJSON(Object model, Object contentType)Accepts a Collection or a JavaBean object which is converted to JSON.org.apache.http.entity.InputStreamEntityencodeStream(Object data, Object contentType)Default request encoder for a binary stream.org.apache.http.HttpEntityencodeText(Object data, Object contentType)Default handler used for a plain text content-type.org.apache.http.HttpEntityencodeXML(Object xml, Object contentType)Encode the content as XML.groovy.lang.ClosuregetAt(Object contentType)Retrieve a encoder for the given content-type.Iterator<Map.Entry<String,groovy.lang.Closure>>iterator()Iterate over the entire parser mapgroovy.lang.ClosurepropertyMissing(Object key)Alias forgetAt(Object)to allow property-style access.voidpropertyMissing(Object key, groovy.lang.Closure value)Alias forputAt(Object, Closure)to allow property-style access.voidputAt(Object contentType, groovy.lang.Closure value)Register a new encoder for the given content type.voidsetCharset(String charset)Set the charset used in the content-type header of all requests that send textual data.
-
-
-
Method Detail
-
setCharset
public void setCharset(String charset)
Set the charset used in the content-type header of all requests that send textual data. This must be a chaset supported by the Java platform- Parameters:
charset-- See Also:
Charset.forName(String)
-
encodeStream
public org.apache.http.entity.InputStreamEntity encodeStream(Object data, Object contentType) throws UnsupportedEncodingException
Default request encoder for a binary stream. Acceptable argument types are:- InputStream
- byte[] / ByteArrayOutputStream
- Closure
- Parameters:
data-- Returns:
- an
HttpEntityencapsulating this request data - Throws:
UnsupportedEncodingException
-
encodeText
public org.apache.http.HttpEntity encodeText(Object data, Object contentType) throws IOException
Default handler used for a plain text content-type. Acceptable argument types are:- Closure
- Writable
- Reader
PrintWriteris passed as the single argument to the closure. Any data sent to the writer from the closure will be sent to the request content body.- Parameters:
data-- Returns:
- an
HttpEntityencapsulating this request data - Throws:
IOException
-
encodeForm
public org.apache.http.client.entity.UrlEncodedFormEntity encodeForm(Map<?,?> params) throws UnsupportedEncodingException
Set the request body as a url-encoded list of parameters. This is typically used to simulate a HTTP form POST. For multi-valued parameters, enclose the values in a list, e.g.[ key1 : ['val1', 'val2'], key2 : 'etc.' ]
- Parameters:
params-- Returns:
- an
HttpEntityencapsulating this request data - Throws:
UnsupportedEncodingException
-
encodeForm
public org.apache.http.client.entity.UrlEncodedFormEntity encodeForm(Map<?,?> params, Object contentType) throws UnsupportedEncodingException
- Throws:
UnsupportedEncodingException
-
encodeForm
public org.apache.http.HttpEntity encodeForm(String formData, Object contentType) throws UnsupportedEncodingException
Accepts a String as a url-encoded form post. This method assumes the String is an already-encoded POST string.- Parameters:
formData- a url-encoded form POST string. See The W3C spec for more info.- Returns:
- an
HttpEntityencapsulating this request data - Throws:
UnsupportedEncodingException
-
encodeXML
public org.apache.http.HttpEntity encodeXML(Object xml, Object contentType) throws UnsupportedEncodingException
Encode the content as XML. The argument may be either an object whosetoStringproduces valid markup, or a Closure which will be interpreted as a builder definition. A closure argument is passed toStreamingMarkupBuilder#bind(groovy.lang.Closure).- Parameters:
xml- data that defines the XML structure- Returns:
- an
HttpEntityencapsulating this request data - Throws:
UnsupportedEncodingException
-
encodeJSON
public org.apache.http.HttpEntity encodeJSON(Object model, Object contentType) throws UnsupportedEncodingException
Accepts a Collection or a JavaBean object which is converted to JSON. A Map or POJO/POGO will be converted to a
JSONObject, and any other collection type will be converted to aJSONArray. A String or GString will be interpreted as valid JSON and passed directly as the request body (with charset conversion if necessary.)If a Closure is passed as the model, it will be executed as if it were a JSON object definition passed to a
JsonGroovyBuilder. In order for the closure to be interpreted correctly, there must be a 'root' element immediately inside the closure. For example:builder.post( JSON ) { body = { root { first { one = 1 two = '2' } second = 'some string' } } }will return the following JSON string:
{"root":{"first":{"one":1,"two":"2"},"second":"some string"}}- Parameters:
model- data to be converted to JSON, as specified above.- Returns:
- an
HttpEntityencapsulating this request data - Throws:
UnsupportedEncodingException
-
createEntity
protected org.apache.http.entity.StringEntity createEntity(Object ct, String data) throws UnsupportedEncodingException
Helper method used by encoder methods to create anHttpEntityinstance that encapsulates the request data. This may be used by any non-streaming encoder that needs to send textual data. It also sets thecharsetportion of the content-type header.- Parameters:
ct- content-type of the datadata- textual request data to be encoded- Returns:
- an instance to be used for the
request content - Throws:
UnsupportedEncodingException
-
buildDefaultEncoderMap
protected Map<String,groovy.lang.Closure> buildDefaultEncoderMap()
Returns a map of default encoders. Override this method to change what encoders are registered by default. You can of course callsuper.buildDefaultEncoderMap()and then add or remove from that result as well.
-
getAt
public groovy.lang.Closure getAt(Object contentType)
Retrieve a encoder for the given content-type. This is called by HTTPBuilder to retrieve the correct encoder for a given content-type. The encoder is then used to serialize the request data in the request body.- Parameters:
contentType-- Returns:
- encoder that can interpret the given content type, or null.
-
putAt
public void putAt(Object contentType, groovy.lang.Closure value)
Register a new encoder for the given content type. If any encoder previously existed for that content type it will be replaced. The closure must return anHttpEntity. It will also usually accept a single argument, which will be whatever is set in the request configuration closure viaHTTPBuilder.RequestConfigDelegate.setBody(Object).- Parameters:
contentType-closure-
-
propertyMissing
public groovy.lang.Closure propertyMissing(Object key)
Alias forgetAt(Object)to allow property-style access.- Parameters:
key-- Returns:
-
propertyMissing
public void propertyMissing(Object key, groovy.lang.Closure value)
Alias forputAt(Object, Closure)to allow property-style access.- Parameters:
key-value-
-
-