Thread executing an HTTP request asynchronously

The request is sent to uri. Either uri, or uri_root and uri_tail, must be set in subclasses.

If deserialize_json, the default behavior, the response is deserialized from JSON

If delay > 0.0, sending the request is delayed by the given delay in seconds. It can be used to delay resending a request on error.

Four callback methods act on the main/UI thread, they should be implemented as needed in subclasses:

See full example at examples/http_request_example.nit.

Introduced properties

fun after

app :: AsyncHttpRequest :: after

Complete this request whether it was a success or not
fun before

app :: AsyncHttpRequest :: before

Prepare the UI or other parts of the program before executing the REST request
fun delay: Float

app :: AsyncHttpRequest :: delay

Delay in seconds before sending this request
fun delay=(delay: Float)

app :: AsyncHttpRequest :: delay=

Delay in seconds before sending this request
fun deserialize_json: Bool

app :: AsyncHttpRequest :: deserialize_json

Should the response content be deserialized from JSON?
fun deserialize_json=(deserialize_json: Bool)

app :: AsyncHttpRequest :: deserialize_json=

Should the response content be deserialized from JSON?
fun on_fail(error: Error)

app :: AsyncHttpRequest :: on_fail

Invoked when the HTTP request has failed and no data was received or deserialization failed
fun on_load(result: nullable Object, http_status_code: Int)

app :: AsyncHttpRequest :: on_load

Invoked when the HTTP request returned valid data
fun uri: Text

app :: AsyncHttpRequest :: uri

URI target of this request, by default it is composed of uri_root / uri_tail
abstract fun uri_root: String

app :: AsyncHttpRequest :: uri_root

Root URI of the remote server, usually the scheme and remote host
fun uri_tail: String

app :: AsyncHttpRequest :: uri_tail

Right part of the URI, after uri_root, often the resource path and the query

Redefined properties

redef type SELF: AsyncHttpRequest

app $ AsyncHttpRequest :: SELF

Type of this instance, automatically specialized in every class
redef fun main: E

app $ AsyncHttpRequest :: main

Main method of this thread
redef fun main: E

android :: http_request $ AsyncHttpRequest :: main

Main method of this thread
redef fun start

app $ AsyncHttpRequest :: start

Start executing this thread

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type E: nullable Object

pthreads :: Thread :: E

Type returned by main
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
fun after

app :: AsyncHttpRequest :: after

Complete this request whether it was a success or not
fun before

app :: AsyncHttpRequest :: before

Prepare the UI or other parts of the program before executing the REST request
fun cancel

pthreads :: Thread :: cancel

Cancel the execution of the thread
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
fun delay: Float

app :: AsyncHttpRequest :: delay

Delay in seconds before sending this request
fun delay=(delay: Float)

app :: AsyncHttpRequest :: delay=

Delay in seconds before sending this request
fun deserialize_json: Bool

app :: AsyncHttpRequest :: deserialize_json

Should the response content be deserialized from JSON?
fun deserialize_json=(deserialize_json: Bool)

app :: AsyncHttpRequest :: deserialize_json=

Should the response content be deserialized from JSON?
fun finalize

core :: Finalizable :: finalize

Liberate any resources held by self before the memory holding self is freed
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun hash: Int

core :: Object :: hash

The hash code of the object.
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
fun is_done: Bool

pthreads :: Thread :: is_done

Is this thread finished ? True when main returned
protected fun is_done=(is_done: Bool)

pthreads :: Thread :: is_done=

Is this thread finished ? True when main returned
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
fun join: E

pthreads :: Thread :: join

Join this thread to the calling thread
fun main: E

pthreads :: Thread :: main

Main method of this thread
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun on_fail(error: Error)

app :: AsyncHttpRequest :: on_fail

Invoked when the HTTP request has failed and no data was received or deserialization failed
fun on_load(result: nullable Object, http_status_code: Int)

app :: AsyncHttpRequest :: on_load

Invoked when the HTTP request returned valid data
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
fun start

pthreads :: Thread :: start

Start executing this thread
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
fun uri: Text

app :: AsyncHttpRequest :: uri

URI target of this request, by default it is composed of uri_root / uri_tail
abstract fun uri_root: String

app :: AsyncHttpRequest :: uri_root

Root URI of the remote server, usually the scheme and remote host
fun uri_tail: String

app :: AsyncHttpRequest :: uri_tail

Right part of the URI, after uri_root, often the resource path and the query
package_diagram app::AsyncHttpRequest AsyncHttpRequest pthreads::Thread Thread app::AsyncHttpRequest->pthreads::Thread core::Finalizable Finalizable pthreads::Thread->core::Finalizable ...core::Finalizable ... ...core::Finalizable->core::Finalizable app::SimpleAsyncHttpRequest SimpleAsyncHttpRequest app::SimpleAsyncHttpRequest->app::AsyncHttpRequest app::MyHttpRequest MyHttpRequest app::MyHttpRequest->app::AsyncHttpRequest

Ancestors

class Finalizable

core :: Finalizable

An object needing finalization
interface Object

core :: Object

The root of the class hierarchy.

Parents

abstract class Thread

pthreads :: Thread

Handle to a thread

Children

class MyHttpRequest

app :: MyHttpRequest

Simple asynchronous HTTP request to http://example.com/ displaying feedback to the window
class SimpleAsyncHttpRequest

app :: SimpleAsyncHttpRequest

Simple AsyncHttpRequest where uri is an attribute

Class definitions

app $ AsyncHttpRequest
# Thread executing an HTTP request asynchronously
#
# The request is sent to `uri`.
# Either `uri`, or `uri_root` and `uri_tail`, must be set in subclasses.
#
# If `deserialize_json`, the default behavior, the response is deserialized from JSON
#
# If `delay > 0.0`, sending the request is delayed by the given `delay` in seconds.
# It can be used to delay resending a request on error.
#
# Four callback methods act on the main/UI thread,
# they should be implemented as needed in subclasses:
# * `before`
# * `on_load`
# * `on_fail`
# * `after`
#
# See full example at `examples/http_request_example.nit`.
abstract class AsyncHttpRequest
	super Thread

	# URI target of this request, by default it is composed of `uri_root / uri_tail`
	fun uri: Text do return uri_root / uri_tail

	# Root URI of the remote server, usually the scheme and remote host
	fun uri_root: String is abstract

	# Right part of the URI, after `uri_root`, often the resource path and the query
	fun uri_tail: String do return ""

	# Should the response content be deserialized from JSON?
	var deserialize_json = true is writable

	# Delay in seconds before sending this request
	var delay = 0.0 is writable

	redef fun start
	do
		before
		super
	end

	redef fun main
	do
		var delay = delay
		if delay > 0.0 then delay.sleep

		var uri = uri

		# Execute REST request
		var rep = uri.http_get
		if rep.is_error then
			app.run_on_ui_thread new RestRunnableOnFail(self, rep.error)
			return null
		end

		if deserialize_json then
			# Deserialize
			var deserializer = new JsonDeserializer(rep.value)
			var res = deserializer.deserialize
			if deserializer.errors.not_empty then
				app.run_on_ui_thread new RestRunnableOnFail(self, deserializer.errors.first)
			else
				app.run_on_ui_thread new RestRunnableOnLoad(self, res, rep.code)
			end
		else
			# Return text data
			app.run_on_ui_thread new RestRunnableOnLoad(self, rep.value, rep.code)
			return null
		end

		app.run_on_ui_thread new RestRunnableJoin(self)

		return null
	end

	# Prepare the UI or other parts of the program before executing the REST request
	fun before do end

	# Invoked when the HTTP request returned valid data
	#
	# If `deserialize_json`, the default behavior, this method is invoked only if deserialization was successful.
	# In this case, `result` may be any deserialized object.
	#
	# Otherwise, if `not deserialize_json`, `result` contains the content of the response as a `String`.
	fun on_load(result: nullable Object, http_status_code: Int) do end

	# Invoked when the HTTP request has failed and no data was received or deserialization failed
	fun on_fail(error: Error) do print_error "HTTP request '{uri}' failed with: {error}"

	# Complete this request whether it was a success or not
	fun after do end
end
lib/app/http_request.nit:48,1--140,3

android :: http_request $ AsyncHttpRequest
redef class AsyncHttpRequest

	redef fun main
	do
		var res = super
		jvm.detach_current_thread
		return res
	end
end
lib/android/http_request.nit:84,1--92,3