发送 JSON 到服务器给出 415 Unsupported Media Type
Sending JSON to server is giving 415 Unsupported Media Type
我有以下 angular 代码:
<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。至少在我检查发送数据时它是这么说的。
这是我的header请求数据:
我在这里错过了什么?
似乎 header content-type 设置为 text/html,即使 body 是 JSON。我想您需要在 Angular 代码的 post 某处将 content-type 设置为 application/json。
"I downloaded Jersey 2.17 with all dependencies. AT least that what it says on their download site"
是的,所以 the Jersey distribution (Jersey JAX-RS 2.0 RI bundle ) 没有捆绑 JSON 转换支持,除了可以从 InputStream
转换的基本低级类型。因此,除了 Jersey Bundle 中的罐子之外没有其他任何东西,您唯一使用的类型是 String
、InputStream
和 byte[]
。如果你试图操纵 JSON
并没有多大帮助
转换的工作原理是通过使用 MessageBodyReader
s 和 MessageBodyWriter
s。我不知道 JSONObject
是什么,但我猜它来自 here。在任何情况下,您都需要一个 MessageBodyReader
来处理传入的转换。我猜你没有。我个人不知道从哪里可以买到那个特定的 API。
我会改用可以处理 JSON 到 POJO 映射的库。杰克逊是我会推荐的。基本的很容易理解。说这是你的 JSON
{"name":"your name", "id": "2"}
您需要做的就是使用 JavaBean naming convention 创建一个带有字段和属性的 class。所以对于上面的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 提供程序。下载以下内容
从下图中得到所有的
我有一张来自另一个 post 的图像,带有 v2.2.3-忽略版本。您想要为所有这些版本获得 2.3.2 的版本。对于第一个依赖,都可以在上面的link中找到。只需在搜索栏中搜索它们。当你找到它时,select版本并下载它。
添加这些罐子后。您应该 JSON 支持 POJO。
我有以下 angular 代码:
<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。至少在我检查发送数据时它是这么说的。
这是我的header请求数据:
我在这里错过了什么?
似乎 header content-type 设置为 text/html,即使 body 是 JSON。我想您需要在 Angular 代码的 post 某处将 content-type 设置为 application/json。
"I downloaded Jersey 2.17 with all dependencies. AT least that what it says on their download site"
是的,所以 the Jersey distribution (Jersey JAX-RS 2.0 RI bundle ) 没有捆绑 JSON 转换支持,除了可以从 InputStream
转换的基本低级类型。因此,除了 Jersey Bundle 中的罐子之外没有其他任何东西,您唯一使用的类型是 String
、InputStream
和 byte[]
。如果你试图操纵 JSON
转换的工作原理是通过使用 MessageBodyReader
s 和 MessageBodyWriter
s。我不知道 JSONObject
是什么,但我猜它来自 here。在任何情况下,您都需要一个 MessageBodyReader
来处理传入的转换。我猜你没有。我个人不知道从哪里可以买到那个特定的 API。
我会改用可以处理 JSON 到 POJO 映射的库。杰克逊是我会推荐的。基本的很容易理解。说这是你的 JSON
{"name":"your name", "id": "2"}
您需要做的就是使用 JavaBean naming convention 创建一个带有字段和属性的 class。所以对于上面的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 提供程序。下载以下内容
从下图中得到所有的
我有一张来自另一个 post 的图像,带有 v2.2.3-忽略版本。您想要为所有这些版本获得 2.3.2 的版本。对于第一个依赖,都可以在上面的link中找到。只需在搜索栏中搜索它们。当你找到它时,select版本并下载它。
添加这些罐子后。您应该 JSON 支持 POJO。