com.seanshubin.http.values:http-values-parent

HTTP as a pure function

License

License

GroupId

GroupId

com.seanshubin.http.values
ArtifactId

ArtifactId

http-values-parent
Last Version

Last Version

1.0.1
Release Date

Release Date

Type

Type

pom
Description

Description

com.seanshubin.http.values:http-values-parent
HTTP as a pure function
Project URL

Project URL

https://github.com/SeanShubin/http-values
Source Code Management

Source Code Management

https://github.com/SeanShubin/http-values

Download http-values-parent

How to add to project

<!-- https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-parent/ -->
<dependency>
    <groupId>com.seanshubin.http.values</groupId>
    <artifactId>http-values-parent</artifactId>
    <version>1.0.1</version>
    <type>pom</type>
</dependency>
// https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-parent/
implementation 'com.seanshubin.http.values:http-values-parent:1.0.1'
// https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-parent/
implementation ("com.seanshubin.http.values:http-values-parent:1.0.1")
'com.seanshubin.http.values:http-values-parent:pom:1.0.1'
<dependency org="com.seanshubin.http.values" name="http-values-parent" rev="1.0.1">
  <artifact name="http-values-parent" type="pom" />
</dependency>
@Grapes(
@Grab(group='com.seanshubin.http.values', module='http-values-parent', version='1.0.1')
)
libraryDependencies += "com.seanshubin.http.values" % "http-values-parent" % "1.0.1"
[com.seanshubin.http.values/http-values-parent "1.0.1"]

Dependencies

There are no dependencies for this project. It is a standalone project that does not depend on any other jars.

Project Modules

  • domain
  • server-jetty
  • client-apache
  • client-google

Http Values

Http without mutable state

Rationale

Java's servlet api is designed around side effects on the response. It has a signature like this:

javax.servlet.Servlet
public void service(ServletRequest req,
                    ServletResponse res)
             throws ServletException,
                    java.io.IOException

I wanted to treat the http request/response process as a function, like so

// Client
trait Sender {
  def send(request: RequestValue): ResponseValue
}

// Server
trait Receiver {
  def receive(request: RequestValue): ResponseValue
}

This allows implementors to test pure functions rather than dealing with streams.

There is also a good bit of support for handling dispatch in a testable way. A server can compose a bunch of named receivers together, an be confident that any path collisions will fail immediately with a sensible error message, rather than having an arbitrary receiver pick up the request.

Limitations

  • The request and response values are reified immediately. This is usually not a problem unless your application typically ignores large portions of the request or response and thus could be optimized by waiting until they needed to be reified.
  • By design, this library does not handle streaming. If you need streaming this is the wrong tool for the job.

Versions

Version
1.0.1
1.0