Ошибка 415 при POST с майкой

Когда я использую POST на стороне клиента, я получаю следующую ошибку.

HTTP Status 415 - Unsupported Media Type
Type: Status Report
Message: Unsupported Media Type
Description: The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.

Я пытался решить проблему после многих сообщений. Надеюсь, я не использовал несовместимые решения.

Часть GET работает нормально, и я использую Gson для преобразования в JSON.

Первоначально мой код не распространялся на Application, но он был частью решения в другом посте, где они зарегистрировали поддержку Jackson для JSON.

Это код для моего класса обслуживания:

package com.tutorialspoint;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.glassfish.jersey.jackson.JacksonFeature;

import com.google.gson.Gson;

@Path("/UserService")

public class UserService extends Application
{
    UserDao userDao = new UserDao();

    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(JacksonFeature.class);

        return classes;
    }

    @GET
    @Path("/users")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getUsers()
    {
        List<User> userList = userDao.getAllUsers();
        Response.Status responseStatus = Response.Status.ACCEPTED;

        return getJSONResponse(responseStatus, userList);
    }

    @POST
    @Path("/users")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUser
    (
            @FormParam("id") int id,
            @FormParam("name") String name,
            @FormParam("profession") String profession,
            @Context HttpServletResponse servletResponse) throws IOException
    {
        User user = new User(id, name, profession);

        boolean userAdded = userDao.addUser(user);

        if(userAdded)
        {
            return getJSONResponse(Status.CREATED, id);
        }

        //Should be changed to an error response later.
        return getJSONResponse(Status.CREATED, id);
    }

    public static Response getJSONResponse(Response.Status status, Object entity)
    {
        String json = new Gson().toJson(entity);

        return Response.status(status).entity(json).header("Access-Control-Allow-Origin", "*").build();
    }
}

Это запрос клиента. Он был захвачен с помощью команды nc из Linux на cient компьютере.

POST /UserManagement/rest/UserService/users HTTP/1.1
Host: localhost:58585
Connection: keep-alive
Content-Length: 47
Accept: application/json
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36
content-type: text/plain
Referer: http://localhost:4200/persons
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"id":1,"name":"Mahesh","profession":"Teacher"}

заранее спасибо.


ИЗМЕНИТЬ 01

Поэтому вам нужно отправить заголовок с именем Content-type и значением application/json вместо text/plain

Я отправил запрос с типом содержимого: application/json, как было предложено пользователем @user7294900. (Я не мог правильно отправить его через мой клиент в Angular 2, поэтому вместо этого я использовал telnet)

POST /UserManagement/rest/UserService/users HTTP/1.1
Host: localhost:58585
Connection: keep-alive
Content-Length: 47
Accept: application/json
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36
content-type: application/json
Referer: http://localhost:4200/persons
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"id":1,"name":"Mahesh","profession":"Teacher"}

После этого я получил ошибку 500, как заявил @braunpet.

Вы хотите, чтобы ваш клиент отправлял JSON, но серверная часть ожидает HTML-форму (@FormParam), которая отправляется как медиа-тип application/x-www-form-urlencoded.

После этого я изменил свой класс службы следующим образом (используя пользователя в качестве параметра для createUser):

package com.tutorialspoint;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

//import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
//import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
//import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.glassfish.jersey.jackson.JacksonFeature;

import com.google.gson.Gson;

@Path("/UserService")

public class UserService extends Application
{
    UserDao userDao = new UserDao();

    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(JacksonFeature.class);

        return classes;
    }

    @GET
    @Path("/users")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getUsers()
    {
        List<User> userList = userDao.getAllUsers();
        Response.Status responseStatus = Response.Status.ACCEPTED;

        return getJSONResponse(responseStatus, userList);
    }

    @POST
    @Path("/users")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUser
    (
            User user
//          @FormParam("id") int id,
//          @FormParam("name") String name,
//          @FormParam("profession") String profession,
//          @Context HttpServletResponse servletResponse
    ) throws IOException
    {
//      User user = new User(id, name, profession);

        boolean userAdded = userDao.addUser(user);

        if(userAdded)
        {
//          return getJSONResponse(Status.CREATED, id);
            return getJSONResponse(Status.CREATED, user.getId());
        }

        //Should be changed to an error response later.
//      return getJSONResponse(Status.CREATED, id);
        return getJSONResponse(Status.CREATED, user.getId());
    }

    public static Response getJSONResponse(Response.Status status, Object entity)
    {
        String json = new Gson().toJson(entity);

        return Response.status(status).entity(json).header("Access-Control-Allow-Origin", "*").build();
    }
}

И вернулся к ошибке 415.


person SEMP    schedule 04.02.2018    source источник
comment
У вас проблема с методом createUser. Вы хотите, чтобы ваш клиент отправлял JSON, но серверная часть ожидает HTML-форму (@FormParam), которая отправляется как тип мультимедиа application/x-www-form-urlencoded. Если ваш провайдер JSON интегрируется с Джерси, вы сможете написать Response createUser( User user ).   -  person braunpet    schedule 04.02.2018


Ответы (2)


Вы должны объявить отправку типа содержимого json из-за следующего определения в вашем коде:

 @Consumes(MediaType.APPLICATION_JSON)

Поэтому вам нужно отправить заголовок с именем Content-type и значением application/json вместо text/plain

person user7294900    schedule 04.02.2018

Убедитесь, что у вас есть эта зависимость в вашем проекте

группа компиляции: «org.glassfish.jersey.media», имя: «jersey-media-json-jackson», версия: «2.27»

person Maayan Hope    schedule 11.12.2018