【问题标题】:Sending JSON to server is giving 415 Unsupported Media Type将 JSON 发送到服务器会给出 415 Unsupported Media Type
【发布时间】:2015-04-22 05:26:56
【问题描述】:

我有以下角码:

<button ng-click="ctrl.submit(light)">Switch</button>

按钮点击由以下方式处理:

   self.submit = function(light) {
        console.log("==============================");
        console.log("clicked button: ", light);
        console.log("==============================");

        $http.post('/ARHomeAutomation/rest/light/state/', light).then(function(response) {
            console.log('headers: ' , response.headers);
            console.log('status: ', response.status);
            console.log('config: ', response.config);
            console.log('data: ', response.data);
            self.state = response.data;
        }, function(errResponse) {
          console.error('Error while updating light state');
        })
        console.log('User clicked submit with: ', light.id );
        console.log('response: ', self.light);
    }

在服务器端,我有以下应该响应请求的方法:

 @POST
 @Path("/state/")
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.TEXT_HTML)
 public String setStateOfLight(JSONObject aLight) {
    if(aLight == null) {
      return "It's a null";
    } else {
      System.out.println("content: " + aLight);
    }
    JSONObject jsonObject = new JSONObject();
    //Update the state of the light with the given id
    for(Light light: lightCollection) {
        // .....
    }
    return getLightsStateAsJSON();
 }

当我点击我的按钮时,我会收到以下消息:

根据 Firefox,我确实在我的请求中发送了 JSON。至少在我检查发送数据时是这样说的。

这是我的请求头数据:

我在这里错过了什么?

【问题讨论】:

  • 您可能没有MessageBodyReader 类型JSONObject。如果是这种情况,我会想象这会记录在服务器中
  • peeskillet,服务器端没有日志记录。就好像它一开始就没有到达那里一样。
  • 您使用的是什么 JAX-RS 实现(和版本)?
  • 或者您可以只显示所有依赖项 Maven 还是只显示 jars。
  • 你想知道这个:Manifest-Version: 1.0 Bnd-LastModified: 1407413291581 Build-Id: 08/07/2014 02:08 PM Build-Jdk: 1.7.0_60 Built-By: m_potociar Bundle -描述:用于 RESTful Web 服务 (JAX-RS) 的 Java API Bundle-DocURL:oracle.com Bundle-License:glassfish.java.net/public/CDDL+GPL_1_1.html,http://glassfish.java.net/public/CDDL+GPL_1_1.html Bundle-ManifestVersion: 2 Bundle-Name: javax.ws.rs-api Bundle-SymbolicName: javax.ws.rs-api Bundle-Vendor: Oracle Corporation Bundle-Version: 2.0.1 没有按我的意愿打印...

标签: java json angularjs jax-rs jersey-2.0


【解决方案1】:

“我下载了包含所有依赖项的 Jersey 2.17。至少在他们的下载网站上说的是”

是的,所以 the Jersey distribution (Jersey JAX-RS 2.0 RI bundle ) 没有捆绑 JSON 转换支持,除了基本的低级类型,可以从 InputStream 转换。因此,除了该 Jersey Bundle 中的罐子之外,没有其他任何东西,您使用的唯一类型是 StringInputStreambyte[]。如果您尝试操纵 JSON,这并没有多大帮助

转换的工作原理是通过使用MessageBodyReaders 和MessageBodyWriters。我不知道JSONObject 是什么,但我猜它来自here。在任何情况下,您都需要一个MessageBodyReader 来处理传入的转换。我的猜测是你没有。我个人不知道在哪里可以找到该特定 API 的。

我会改为使用可以处理 JSON 到 POJO 映射的库。杰克逊是我推荐的人。基本很容易理解。说这是你的 JSON

{"name":"your name", "id": "2"}

您需要做的就是使用JavaBean naming convention 创建一个具有字段和属性的类。所以对于上面的 JSON,我们可以使用这个

public class User {
    private String name;
    private String id;

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

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
}

现在您的方法参数可以接受User 类型。

要获得此支持,您需要添加 Jackson 提供程序。下载下面的

  • jersey-media-json-jackson

  • 从下图中获取所有的一个

    我有一张来自另一个帖子的 v2.2.3 的图片 - 忽略版本。您想要为所有这些获得 2.3.2 的版本。对于第一个依赖项,它们都可以在上面的链接中找到。只需在搜索栏中搜索它们。找到后,选择版本并下载。

添加这些罐子后。你应该有 JSON 到 POJO 的支持。

【讨论】:

    【解决方案2】:

    标题内容类型似乎设置为 text/html,即使正文是 JSON。我想您需要在 Angular 代码中的某处将内容类型设置为 application/json。

    【讨论】:

    • 响应头内容类型设置为text/html。不是请求标头内容类型。或者,另一种可能,我不明白 Response 和 request headers 的含义。
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2015-08-06
    • 2012-07-14
    相关资源
    最近更新 更多