REST api 未从客户端调用 Web 服务
REST api is not calling from client to webservice
我使用 POST
方法创建了 Jersey REST
网络服务 'RegisterService'
。我想在 'RegisterClientPost'
class 中接收 '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对象并return返回'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 的模型 class
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>
邮递员收到错误:
服务器拒绝了此请求,因为请求实体的格式不受所请求方法所请求资源的支持。
您的资源定义了以下需要 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!");
}
我使用 POST
方法创建了 Jersey REST
网络服务 'RegisterService'
。我想在 'RegisterClientPost'
class 中接收 '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对象并return返回'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 的模型 class
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>
邮递员收到错误: 服务器拒绝了此请求,因为请求实体的格式不受所请求方法所请求资源的支持。
您的资源定义了以下需要 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!");
}