Jira Server/Data Center: Делаем так, чтобы REST API Browser видел, что наш POST REST метод принимает application/json

В этой статье я покажу Вам, как сделать так, что REST API Browser будет показывать, что Ваш POST REST метод принимает на вход application/json в плагинах для Jira Server/ Data Center.

Проблема

Давайте создадим новый плагин для Jira Server через Atlassian SDK и добавим REST plugin модуль. По умолчанию файл src/main/java/ru/matveev/alexey/atlassian/tutorial/rest/MyRestEndpoint.java будет выглядеть вот так:

@Path("/message")
public class MyRestEndpoint {

    @GET
    @AnonymousAllowed
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response getMessage()
    {
       return Response.ok(new MyRestEndpointModel("Hello World")).build();
    }
}

У нас получился GET REST метод. Поменяем его на POST:

@Path("/message")
public class MyRestEndpoint {

    @POST
    @AnonymousAllowed
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response postMessage(String body)
    {
       return Response.ok(new MyRestEndpointModel(body)).build();
    }
}

Я поменял аннотацию @GET на @POST и добавил параметр, в который передается тело запроса. Далее сделал так, что метод возвращает тело запроса, как результат.

Теперь упакуем плагин и запустим его в Jira.

После того, как Jira стартанула, идем в REST API Browser и находим наш POST метод.

This image has an empty alt attribute; its file name is Screenshot-2020-09-15-at-17.38.05-1-1024x451.png

Как Вы видите, в поле Representation у нас значение */*, а мы хотим application/json.

Давайте еще сделаем по-другому.

Я добавил файл src/main/java/ru/matveev/alexey/atlassian/tutorial/rest/MyRequestBody.java:

@Data
public class MyRequestBody {
    String value;
}

Затем изменил наш POST метод на вот такой:

@Path("/message")
public class MyRestEndpoint {

    @POST
    @AnonymousAllowed
    @Produces({MediaType.APPLICATION_JSON})
    public Response postMessage(MyRequestBody body)
    {
       return Response.ok(new MyRestEndpointModel(body.getValue())).build();
    }
}

Как Вы видите, я изменил тип параметра body со String на MyRequestBody, что означает, что теперь нам нужно передавать json вот в таком виде:

{"value": "Hello World"}

Выполним наш POST метод.

У нас ошибка 415, которая означает Unsupported Media Type. И все правильно, мы должны передать в качестве Content-Type application/json, а у нас */*. И мы не можем его поменять.

Решение

Нужно добавить аннотацию @Consumes в POST метод:

@Path("/message")
public class MyRestEndpoint {

    @POST
    @AnonymousAllowed
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_JSON})
    public Response postMessage(MyRequestBody body)
    {
       return Response.ok(new MyRestEndpointModel(body.getValue())).build();
    }
}

Я добавил вот такую строчку

@Consumes({MediaType.APPLICATION_JSON})

Теперь пересобираем проект и смотрим результат.

Все работает. Мы можем выбрать application/json и наш POST метод возвращает результат.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Leave a Reply

%d bloggers like this:

Spelling error report

The following text will be sent to our editors: