当前位置: 首页 > 面试题库 >

无法将JSON对象发送到Rest Web服务

林修真
2023-03-14
问题内容

我有一个REST Web服务配置如下:

@Path("/users")
public class UserManager {

@Context
UriInfo uriInfo;

@POST
@Consumes("application/json")
public void createUser(User user) {
    URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName())
            .build();
    Response res = Response.created(uri).build();
    try {
        MongoDbDataAccess.getInstance().addUser(user);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我的Tomcat服务器的配置如下:

<servlet>
  <servlet-name>Jersey REST Service</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>anyq.server.anyq.manager</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
   <servlet-name>Jersey REST Service</servlet-name>
   <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

我创建的POJO如下所示:

@XmlRootElement
public class User {

private long userId;
private String userName;
private String userPassword;

public User() {
    super();
}

public User(long userId, String userName, String userPassword) {
    super();
    this.userId = userId;
    this.userName = userName;
    this.userPassword = userPassword;
}

public long getUserId() {
    return userId;
}

public void setUserId(long userId) {
    this.userId = userId;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserPassword() {
    return userPassword;
}

public void setUserPassword(String userPassword) {
    this.userPassword = userPassword;
}

}

我创建一个测试客户端以测试createUser方法:

public class tester {

public static void main(String[] args) throws UnknownHostException {

    String USER_URI = "http://localhost:8080/AnyAppserver/rest/users";
    User user = new User((long) 451, "mosssi", "464asd64");

    Client client = Client.create();

    WebResource r = client.resource(USER_URI);

    ClientResponse response = r.accept(MediaType.APPLICATION_JSON).post(
            ClientResponse.class, user);


}

但是我收到以下错误:

POST http://localhost:8080/AnyAppserver/rest/users returned a response status of 415 Unsupported Media Type

奇怪的是,当我将所有内容更改为appliction / xml时,它都能正常工作

知道为什么Json不能为我工作吗?


问题答案:

您正在执行:

User user = new User((long) 451, "mosssi", "464asd64");

ClientResponse response = r.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, user);

这是不对的。您应该将真实的JSON字符串发送到您的服务。

获取JSON解析器,例如:gson,然后执行以下操作:

User user = new User(451, "mosssi", "464asd64");
String request = gson.toJson(user);
ClientResponse response = r.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, request );

不要使用旧的泽西捆绑图书馆。下载2.0版本:https:
//jersey.java.net/download.html

将所有库(库和ext库)添加到您的类路径中。

接下来,您需要在类路径中使用jackson软件包:jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar
jackson-databind-2.2.2.jar jackson-jaxrs-base-2.2.1.jar -jaxrs-json-
provider-2.2.1.jar jackson-module-jaxb-annotations-2.2.2.jar

您的服务等级应与此类似:

package anyq.server.anyq.manager;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import anyq.server.common.bean.User;

@Path("/users")
public class AnyQUserManager {

@Context
UriInfo uriInfo;

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response createUser(User user) {
    System.out.println("HELLO WORLD");
    return Response.status(666).entity("Hello world").build();
}
}

最后,您的web.xml应该如下所示:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<servlet>
    <servlet-name>Jersey REST 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>anyq.server.anyq.manager, com.fasterxml.jackson.jaxrs.json</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

在您的客户端类中,执行以下操作:

    String USER_URI = "http://localhost:8080/AnyQserver/rest/users";
    User user = new anyq.server.common.bean.User();
    user.setUserId(15);
    user.setUserName("asd");
    user.setUserPassword("asd");

    Client client = Client.create();
    String request = new Gson().toJson(user);
    System.out.println(request);
    WebResource r = client.resource(USER_URI);
    ClientResponse response = r.type(MediaType.APPLICATION_JSON).post(
            ClientResponse.class, request);
    System.out.println(response.getStatus());

重新启动服务器并运行客户端。如果一切正常,服务器应打印:

INFO: Server startup in 2256 ms
HELLO WORLD

和客户:

{"userId":15,"userName":"asd","userPassword":"asd"}
666

祝好运!

另外,我真的建议您迁移到Maven。



 类似资料:
  • 问题内容: 我正在寻找通过GET将JSON对象发送到服务器。克里斯关于通过JSON将对象数组发布到ASP.Net MVC3的答案适用于httpPOST,但不适用于GET。我的情况也适用于POST,但不适用于GET。如何使GET工作正常这是我的情况:在Controller中,我有以下方法publicActionResult Screenreport(Screentable screendata) 我

  • 问题内容: 我创建了一个需要发布到jersey的json,这是由grizzly运行的具有REST网络服务的服务器获取需要输出的传入json对象。我正在尝试,但不确定如何正确实施。 我有一个在加载时运行此方法的html文件 问题答案: 要将json发送到服务器,首先必须创建json 这就是构造ajax请求以将json作为post var发送的方式。 json现在将在post var中。

  • 问题内容: 我正在尝试在本地网络上的Android应用程序与WampServer之间建立通信。 当我想从服务器读取数据时,我已经成功了,但是当我尝试将数据发送到服务器时却遇到了问题。 我正在使用服务来建立通信: } 和我的PHP文件: 当我运行我的应用程序时,没有任何内容添加到我的数据库中。我认为里面没有东西。 请告诉我我的代码有什么问题? 问题答案: 最后,我成功将JSONObject发送到服务

  • 问题内容: 我正在尝试将JSON对象从Javascript / Jquery发送到PHP,并且在控制台中收到错误消息msg。我究竟做错了什么。我是JS和PHP的新手。 jQuery文件: PHP文件 问题答案: 菲尔(Phil)的出色回答,但自从OP标题说 从javascript( 不是jQuery )发送json对象到php 这是使用(原始)javascript的方法,以防万一有人寻找此方法:

  • 问题内容: 我想使用POST方法将JSONObject发送到服务器。我已经使用凌空库通过字符串参数来正常工作,但是如果我尝试使用json对象,则在调用json对象时显示错误,这是我的代码 我的错误表单服务器是: 如何解决这个问题呢。我要添加 标题,请检查我的代码是否正确。请给我一个解决这个问题的建议 问题答案: JsonObjectRequest中的第三个参数用于以jsonobject形式传递发布

  • 问题内容: 最近5个小时,我一直在尝试将json对象发布到PHP脚本中。我已经阅读了所有文档,似乎代码应该可以,但事实并非如此。发出并接收到请求,但是我无法访问发布的json数据,甚至不知道它是否已正确发送。我不断得到一个空的php数组,而不是json数据。 这是php脚本(test.php) 我正在使用来自https://github.com/pokeb/asi-http- request.gi