diff --git a/akka-docs-dev/rst/java/code/docs/http/javadsl/server/FormFieldRequestValsExampleTest.java b/akka-docs-dev/rst/java/code/docs/http/javadsl/server/FormFieldRequestValsExampleTest.java new file mode 100644 index 0000000000..8b44a5dc6d --- /dev/null +++ b/akka-docs-dev/rst/java/code/docs/http/javadsl/server/FormFieldRequestValsExampleTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2009-2015 Typesafe Inc. + */ + +package docs.http.javadsl.server; + +import akka.http.javadsl.model.ContentTypes; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.headers.RawHeader; +import akka.http.javadsl.server.Marshallers; +import akka.http.javadsl.server.RequestVal; +import akka.http.javadsl.server.Route; +import akka.http.javadsl.server.values.FormField; +import akka.http.javadsl.server.values.FormFields; +import akka.http.javadsl.server.values.Headers; +import akka.http.javadsl.testkit.JUnitRouteTest; +import docs.http.scaladsl.server.directives.Person; +import org.junit.Test; + +public class FormFieldRequestValsExampleTest extends JUnitRouteTest { + + @Test + public void testFormFieldVals() { + //#simple + FormField name = FormFields.stringValue("name"); + FormField age = FormFields.intValue("age"); + + final Route route = + route( + handleWith2(name, age, (ctx, n, a) -> + ctx.complete(String.format("Name: %s, age: %d", n, a)) + ) + ); + + // tests: + final HttpRequest request = + HttpRequest + .POST("/"); + // .withFormData(); // FIXME awaits resolution of https://github.com/akka/akka/issues/18665 + testRoute(route).run(request).assertEntity("Name: ..., age: ..."); + + //#simple + } + + @Test + public void testFormFieldValsUnmarshaling() { + //#custom-unmarshal + FormField sampleId = FormFields.fromString("id", s -> new SampleId(Integer.valueOf(s)), SampleId.class); + + final Route route = + route( + handleWith1(sampleId, (ctx, id) -> + ctx.complete(String.format("SampleId: %s", id)) + ) + ); + + // tests: + final HttpRequest request = + HttpRequest + .POST("/"); + // .withFormData(); // FIXME awaits resolution of https://github.com/akka/akka/issues/18665 + testRoute(route).run(request).assertEntity("Name: ..., age: ..."); + + //#custom-unmarshal + } + + static class SampleId { + public final int id; + + SampleId(int id) { + this.id = id; + } + } + +} \ No newline at end of file diff --git a/akka-docs-dev/rst/java/code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java b/akka-docs-dev/rst/java/code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java index 340819c7e6..c7872959d6 100644 --- a/akka-docs-dev/rst/java/code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java +++ b/akka-docs-dev/rst/java/code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java @@ -5,13 +5,10 @@ package docs.http.javadsl.server; import akka.http.javadsl.model.HttpRequest; -//#by-class import akka.http.javadsl.model.headers.Host; - -//#by-class import akka.http.javadsl.model.headers.RawHeader; -import akka.http.javadsl.server.*; -import akka.http.javadsl.server.values.Header; +import akka.http.javadsl.server.RequestVal; +import akka.http.javadsl.server.Route; import akka.http.javadsl.server.values.Headers; import akka.http.javadsl.testkit.JUnitRouteTest; import org.junit.Test; diff --git a/akka-docs-dev/rst/java/http/routing-dsl/request-vals/form-field-request-vals.rst b/akka-docs-dev/rst/java/http/routing-dsl/request-vals/form-field-request-vals.rst new file mode 100644 index 0000000000..dfe95a1bfc --- /dev/null +++ b/akka-docs-dev/rst/java/http/routing-dsl/request-vals/form-field-request-vals.rst @@ -0,0 +1,33 @@ +.. _form-field-request-vals-java: + +Request Values: FormFields +========================== + +A collection of pre-defined :ref:`request-vals-java` that can be used to extract header values from incoming requests. + +Description +----------- +Header request values allow extracting ``HttpHeader`` values or concrete instances from HTTP requests. + +The ``RequestVal`` builder is made up of 2 steps, initially you need to pick which Header to extract (``byName`` or +``byClass``) and then you need to pick if the header is optionally available or required (i.e. the route should not +match if the header is not present in the request). This is done using one of the below depicted methods:: + + RequestVal instance() + RequestVal<> optionalInstance() + + RequestVal value() + RequestVal> optionalValue() + +Examples +-------- + +``Headers.byClass(Class[HttpHeader])`` + +.. includecode:: ../../../code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java + :include: by-class + +``Headers.byName(String)`` + +.. includecode:: ../../../code/docs/http/javadsl/server/HeaderRequestValsExampleTest.java + :include: by-name diff --git a/akka-docs-dev/rst/java/http/routing-dsl/request-vals/index.rst b/akka-docs-dev/rst/java/http/routing-dsl/request-vals/index.rst index ed8927b5d0..2a7fb32428 100644 --- a/akka-docs-dev/rst/java/http/routing-dsl/request-vals/index.rst +++ b/akka-docs-dev/rst/java/http/routing-dsl/request-vals/index.rst @@ -27,7 +27,7 @@ service. These request values are defined in the following objects: -akka.http.javadsl.server.values.FormFieldsRequestVals +:ref:`akka.http.javadsl.server.values.FormFields ` Contains request values for basic data like URI components, request method, peer address, or the entity data. akka.http.javadsl.server.values.FormFieldsCookies Contains request values representing cookies. diff --git a/akka-http/src/main/scala/akka/http/javadsl/server/values/FormField.scala b/akka-http/src/main/scala/akka/http/javadsl/server/values/FormField.scala index ffdbda4a6e..c2318537d3 100644 --- a/akka-http/src/main/scala/akka/http/javadsl/server/values/FormField.scala +++ b/akka-http/src/main/scala/akka/http/javadsl/server/values/FormField.scala @@ -36,6 +36,7 @@ object FormFields { def hexIntValue(name: String): FormField[jl.Integer] = FormFieldImpl(name.as(Unmarshaller.HexInt)) def hexLongValue(name: String): FormField[jl.Long] = FormFieldImpl(name.as(Unmarshaller.HexLong)) + /** Unmarshals the `name` field using the provided `convert` function. */ def fromString[T](name: String, convert: Function[String, T], clazz: Class[T]): FormField[T] = { implicit val tTag: ClassTag[T] = ClassTag(clazz) FormFieldImpl(name.as(Util.fromStringUnmarshallerFromFunction(convert)))