【问题标题】:REST api is not calling from client to webserviceREST api 没有从客户端调用到 Web 服务
【发布时间】:2018-01-16 06:40:53
【问题描述】:

我用POST 方法创建了一个Jersey REST 网络服务'RegisterService'。我想在'RegisterClientPost' 类中接收'name''email''company' 的值,并将这些值插入数据库并作为JSON 响应发回。 有人可以帮忙吗,如何从客户端调用 api 并返回到服务级别?

Tomcat Server v7.0
Jersey (jaxrs-ri-2.25.1) 
MySQL 5 + version


@Path("/register")
public class RegisterService {
    private static final String REST_URI = "http://localhost:8080/MyFirstJavaTest/rest/register/postPlayer";  
    private Client client = ClientBuilder.newClient();      
    @POST
    @Path("/postPlayer")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response createJsonPlayer(WeekendPlayer player) {
    return client
      .target(REST_URI)
      .request(MediaType.APPLICATION_JSON)
      .post(Entity.entity(player, MediaType.APPLICATION_JSON));
    }
}

//如何获取'RegisterClientPost'中的Player值并插入数据库,传入json对象并返回给'RegisterService'

public class RegisterClientPost {   
    public static void main(String[] args) {                 

            try {           

            String t_Name ="Apple Mango";
            String t_Email ="test@example.com";
            String t_Comp ="Test Ltd";

            Client client = ClientBuilder.newClient();
            WebTarget webTarget 
              = client.target("http://localhost:8080/MyFirstJavaTest/rest");
            WebTarget employeeWebTarget 
              = webTarget.path("/register/postPlayer");
            Invocation.Builder invocationBuilder 
              = employeeWebTarget.request(MediaType.APPLICATION_JSON);          
            Response response 
              = invocationBuilder
              .post(Entity.entity(inputJson, MediaType.APPLICATION_JSON));              

            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatus());
            }          

            con.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }



    }

}

// 带有 getter 和 setter 的模型类

public class WeekendPlayer {

    private String name;
    private String email;
    private String company; 

    public WeekendPlayer()
    {

    }

    public WeekendPlayer(String name, String email, String company)
    {
    super();


    this.name = name;
    this.email = email;
    this.company = company;


    }    

    public String getName()
    {
    return name;
    }

    public void setName(String name)
    {
    this.name = name;
    }

    public String getEmail()
    {
    return email;
    }

    public void setEmail(String email)
    {
    this.email = email;
    }
....

}

// Web.xml 已使用

<servlet>
<servlet-name>Register Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.myfirstjavatest.pkg</param-value>        
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Register Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

邮递员收到错误: 服务器拒绝了此请求,因为请求实体的格式不受所请求方法的请求资源支持。

【问题讨论】:

  • 您的资源定义了@Consumes(MediaType.APPLICATION_FORM_URLENCODED),但您的客户端发送了MediaType.APPLICATION_JSON。将其更改为@Consumes(MediaType.APPLICATION_JSON)
  • @saw303 最好将其发布为答案。

标签: java rest jersey


【解决方案1】:

您的资源定义了以下方法,该方法需要 URL 编码形式的 HTTP POST(请参阅 @Consumes(MediaType.APPLICATION_FORM_URLENCODED)

@POST
@Path("/postPlayer")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response createJsonPlayer(WeekendPlayer player) {
    return Response.ok();
}

但是您的 JAX-RS 客户端使用 MediaType.APPLICATION_JSON 发送 HTTP POST。这就是您收到错误的原因。需要把注解改成@Consumes(MediaType.APPLICATION_JSON)

@POST
@Path("/postPlayer")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createJsonPlayer(WeekendPlayer player) {
    return Response.ok("It works!");
}

【讨论】:

  • 在邮递员中更改为 @Consumes(MediaType.APPLICATION_JSON) 后,我仍然遇到同样的错误。重新启动服务器。
  • HTTP 状态 415 - 不支持的媒体类型。服务器拒绝了这个请求,因为请求实体的格式不受所请求方法的请求资源支持
  • 你如何传递你的参数?
  • 字符串 inputJson = "{\"email\": \"test@example.com\", \"name\": \"Apple Mango\", \"company\": \"测试有限公司\"}";
  • @soccerway 您知道您在问题中发布的代码中没有这个吗?
猜你喜欢
  • 2013-07-03
  • 2014-09-04
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多