REST API question GET /jars/:jarid/plan

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

REST API question GET /jars/:jarid/plan

Stephen Connolly

It says:

> Program arguments can be passed both via the JSON request (recommended) or query parameters.

Has anyone got sample code that sends the JSON request?

I have got the end-point working with query parameters, but I need to support more than 2083 GET URL length limit.

When I have my code like this:

        UriTemplate template = UriTemplate.fromTemplate(apiUrl)
                .literal("/v1/jars")
                .path("jarId")
                .literal("/plan")
                .query("entryClass", "programArg*", "parallelism")
                .build()
                .set("jarId", jarId);
        if (requestBody.getEntryClass() != null) {
            // TODO find a way to have this as entry-class even if the spec says no
            template.set("entryClass", requestBody.getEntryClass());
        }
        if (!requestBody.getProgramArgs().isEmpty()) {
            template.set("programArg", requestBody.getProgramArgs().toArray(new String[0]));
        }
        if (requestBody.getParallelism() > 0) {
            template.set("parallelism", requestBody.getParallelism());
        }
        return get(
                template,
                null,
                null,
                JsonNode.class,
                MEDIA_TYPE_JSON
        );

Then I get the plan returned.

When I change to this

        UriTemplate template = UriTemplate.fromTemplate(apiUrl)
                .literal("/v1/jars")
                .path("jarId")
                .literal("/plan")
                .build()
                .set("jarId", jarId);
        return get(
                template,
                requestBody,
                MEDIA_TYPE_JSON,
                JsonNode.class,
                MEDIA_TYPE_JSON
        );

I get a 404.

Basically, adding the request body makes the URL go 404... For fun I tried having both query parameters and request body and that gets a 404 also.

So does anyone have a working example using the JSON request body (and let's not get started on how a request body is a really bad idea for GET requests)
Reply | Threaded
Open this post in threaded view
|

Re: REST API question GET /jars/:jarid/plan

Chesnay Schepler
I've heard of cases where client libraries are automatically changing
the HTTP method when provided with a body.

To figure out what exactly is received by Flink, enable TRACE logging,
try again and look for logging messages from
"org.apache.flink.runtime.rest.handler.router.RouterHandler"

On 07.03.2019 11:25, Stephen Connolly wrote:

> In the documentation for the /jars/:jarid/plan endpoint
> https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#jars-jarid-plan
>
> It says:
>
> > Program arguments can be passed both via the JSON request
> (recommended) or query parameters.
>
> Has anyone got sample code that sends the JSON request?
>
> I have got the end-point working with query parameters, but I need to
> support more than 2083 GET URL length limit.
>
> When I have my code like this:
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .query("entryClass", "programArg*", "parallelism")
>                 .build()
>                 .set("jarId", jarId);
>         if (requestBody.getEntryClass() != null) {
>             // TODO find a way to have this as entry-class even if the
> spec says no
>             template.set("entryClass", requestBody.getEntryClass());
>         }
>         if (!requestBody.getProgramArgs().isEmpty()) {
>             template.set("programArg",
> requestBody.getProgramArgs().toArray(new String[0]));
>         }
>         if (requestBody.getParallelism() > 0) {
>             template.set("parallelism", requestBody.getParallelism());
>         }
>         return get(
>                 template,
>                 null,
>                 null,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> Then I get the plan returned.
>
> When I change to this
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .build()
>                 .set("jarId", jarId);
>         return get(
>                 template,
>                 requestBody,
>                 MEDIA_TYPE_JSON,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> I get a 404.
>
> Basically, adding the request body makes the URL go 404... For fun I
> tried having both query parameters and request body and that gets a
> 404 also.
>
> So does anyone have a working example using the JSON request body (and
> let's not get started on how a request body is a really bad idea for
> GET requests)


Reply | Threaded
Open this post in threaded view
|

Re: REST API question GET /jars/:jarid/plan

Stephen Connolly


On Thu, 7 Mar 2019 at 11:33, Chesnay Schepler <[hidden email]> wrote:
I've heard of cases where client libraries are automatically changing
the HTTP method when provided with a body.

Hmmm thanks for that... I'll dig into it
 

To figure out what exactly is received by Flink, enable TRACE logging,
try again and look for logging messages from
"org.apache.flink.runtime.rest.handler.router.RouterHandler"

On 07.03.2019 11:25, Stephen Connolly wrote:
> In the documentation for the /jars/:jarid/plan endpoint
> https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#jars-jarid-plan
>
> It says:
>
> > Program arguments can be passed both via the JSON request
> (recommended) or query parameters.
>
> Has anyone got sample code that sends the JSON request?
>
> I have got the end-point working with query parameters, but I need to
> support more than 2083 GET URL length limit.
>
> When I have my code like this:
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .query("entryClass", "programArg*", "parallelism")
>                 .build()
>                 .set("jarId", jarId);
>         if (requestBody.getEntryClass() != null) {
>             // TODO find a way to have this as entry-class even if the
> spec says no
>             template.set("entryClass", requestBody.getEntryClass());
>         }
>         if (!requestBody.getProgramArgs().isEmpty()) {
>             template.set("programArg",
> requestBody.getProgramArgs().toArray(new String[0]));
>         }
>         if (requestBody.getParallelism() > 0) {
>             template.set("parallelism", requestBody.getParallelism());
>         }
>         return get(
>                 template,
>                 null,
>                 null,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> Then I get the plan returned.
>
> When I change to this
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .build()
>                 .set("jarId", jarId);
>         return get(
>                 template,
>                 requestBody,
>                 MEDIA_TYPE_JSON,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> I get a 404.
>
> Basically, adding the request body makes the URL go 404... For fun I
> tried having both query parameters and request body and that gets a
> 404 also.
>
> So does anyone have a working example using the JSON request body (and
> let's not get started on how a request body is a really bad idea for
> GET requests)


Reply | Threaded
Open this post in threaded view
|

Re: REST API question GET /jars/:jarid/plan

Stephen Connolly
Yep that was it. I have created https://issues.apache.org/jira/browse/FLINK-11853 so that it is easier for others to work around if they have restrictions on the HTTP client library choice

On Thu, 7 Mar 2019 at 11:47, Stephen Connolly <[hidden email]> wrote:


On Thu, 7 Mar 2019 at 11:33, Chesnay Schepler <[hidden email]> wrote:
I've heard of cases where client libraries are automatically changing
the HTTP method when provided with a body.

Hmmm thanks for that... I'll dig into it
 

To figure out what exactly is received by Flink, enable TRACE logging,
try again and look for logging messages from
"org.apache.flink.runtime.rest.handler.router.RouterHandler"

On 07.03.2019 11:25, Stephen Connolly wrote:
> In the documentation for the /jars/:jarid/plan endpoint
> https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#jars-jarid-plan
>
> It says:
>
> > Program arguments can be passed both via the JSON request
> (recommended) or query parameters.
>
> Has anyone got sample code that sends the JSON request?
>
> I have got the end-point working with query parameters, but I need to
> support more than 2083 GET URL length limit.
>
> When I have my code like this:
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .query("entryClass", "programArg*", "parallelism")
>                 .build()
>                 .set("jarId", jarId);
>         if (requestBody.getEntryClass() != null) {
>             // TODO find a way to have this as entry-class even if the
> spec says no
>             template.set("entryClass", requestBody.getEntryClass());
>         }
>         if (!requestBody.getProgramArgs().isEmpty()) {
>             template.set("programArg",
> requestBody.getProgramArgs().toArray(new String[0]));
>         }
>         if (requestBody.getParallelism() > 0) {
>             template.set("parallelism", requestBody.getParallelism());
>         }
>         return get(
>                 template,
>                 null,
>                 null,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> Then I get the plan returned.
>
> When I change to this
>
>         UriTemplate template = UriTemplate.fromTemplate(apiUrl)
>                 .literal("/v1/jars")
>                 .path("jarId")
>                 .literal("/plan")
>                 .build()
>                 .set("jarId", jarId);
>         return get(
>                 template,
>                 requestBody,
>                 MEDIA_TYPE_JSON,
>                 JsonNode.class,
>                 MEDIA_TYPE_JSON
>         );
>
> I get a 404.
>
> Basically, adding the request body makes the URL go 404... For fun I
> tried having both query parameters and request body and that gets a
> 404 also.
>
> So does anyone have a working example using the JSON request body (and
> let's not get started on how a request body is a really bad idea for
> GET requests)