Ошибка 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, но он был частью решения в другом посте, где они зарегистрировали Джексона для поддержки 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.
После этого я изменил свой класс Service следующим образом (используя User в качестве параметра для 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.
1 ответ
Убедитесь, что у вас есть эта зависимость в вашем проекте
группа компиляции: 'org.glassfish.jersey.media', имя: 'jersey-media-json-jackson', версия: '2.27'
Вы должны объявить отправку типа контента json из-за следующего определения в вашем коде:
@Consumes(MediaType.APPLICATION_JSON)
Так что вам нужно отправить заголовок с именем Content-type
и значение application/json
вместо text/plain