Json Jax RS API POST和GET方法(RESTful服务)
我有一个关于JAX-RS的项目(家庭作业)。我正在与NetBeans、Jersey和Tomcat合作。例如,在post方法中:Json Jax RS API POST和GET方法(RESTful服务),json,post,get,jax-rs,restful-architecture,Json,Post,Get,Jax Rs,Restful Architecture,我有一个关于JAX-RS的项目(家庭作业)。我正在与NetBeans、Jersey和Tomcat合作。例如,在post方法中: “{”user:{”username:“accavdar”,“gender:“M”,“birthDate:“06.11.1982”}” 当这样的请求出现时,我必须解析这个输入并向我的系统添加新用户。样本响应必须是: { "meta": { "code": 200 }, "data": { "message": "Y
“{”user:{”username:“accavdar”,“gender:“M”,“birthDate:“06.11.1982”}”
当这样的请求出现时,我必须解析这个输入并向我的系统添加新用户。样本响应必须是:
{
"meta": {
"code": 200
},
"data": {
"message": "You successfully created a user."
}
}
预期的错误可能是这样的:
{
"meta": {
"code": 101,
"type": "FieldError",
"errors": [
{
"fieldName": "fullname",
"rejectedValue": null
}
]
}
}
另一个问题是:使用Get方法,开发者可能希望列出系统中的所有用户。回答必须是这样的:
{
"meta": {
"code": 200
},
"data": [
{
"id": 1,
"username": "sample",
"fullname": "sample",
"gender": "M",
"birthDate": "12.02.1990"
},
{
"id": 2,
"username": "sample",
"fullname": "sample",
"gender": "M",
"birthDate": "21.09.1940"
}
]
}
我想将用户保存在一个文本文件中,保存用户的方式没有限制(可以保存在数据库或内存中),但我不知道如何处理请求输入并生成这样的响应。我不想让你做我的家庭作业,但有人能给我一些关于我问题的建议吗
注意:我们将只使用JSON“内容类型:应用程序/JSON”“接受:应用程序/JSON”
EDİT:#Bogdan,非常感谢你的回答。我搜索了你提供的网站。我想了解输出是如何产生的:
{
"meta": {
"code": 200
},
"data": {
"message": "You successfully created a user."
}
}
或
我有“元”和“用户”类
@XmlRootElement(name="data")
public class User {
@XmlElement
public int id ;
@XmlElement
public String username;
@XmlElement
public String fullname;
@XmlElement
public String gender;
@XmlElement
public String birthDate;
public User(){
}
@XmlRootElement(name="meta")
public class Meta {
@XmlElement
int code=200;
public Meta(){
}
我还有这个jaxbcontextresolver类
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>{
private JAXBContext context;
private Class[] types = {User.class, Meta.class};
public JAXBContextResolver() throws Exception {
this.context =
new JSONJAXBContext( JSONConfiguration.mapped().nonStrings("id").nonStrings("code").build(), types);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
for (Class type : types) {
if (type == objectType) {
return context;
}
}
return null;
}
}
@Provider
公共类JAXBContextResolver实现ContextResolver{
私有JAXBContext上下文;
私有类[]类型={User.Class,Meta.Class};
公共JAXBContextResolver()引发异常{
this.context=
新的JSONJAXBContext(JSONConfiguration.mapped().nonStrings(“id”).nonStrings(“代码”).build(),类型);
}
@凌驾
公共JAXBContext getContext(类objectType){
对于(类类型:类型){
if(type==objectType){
返回上下文;
}
}
返回null;
}
}
但是如何创建这个响应结构,有什么可以帮助我的吗?您的应用程序与用户一起工作。这是您的应用程序处理的资源,您的客户机与之交互以创建、更新、删除和获取(基本上) 但是用户是一种抽象资源,因此您的服务器和客户端通过使用来相互交互。表示可以是JSON格式(如您的示例所示)、XML等。您的客户机指定它想要的表示类型,服务器通过
内容类型
指定它返回的表示类型。请求/响应的主体与内容类型匹配
这是一个Java应用程序,因此在应用程序代码中,用户被表示为Java对象。您需要将请求/响应主体转换为具有getter和setter的对象。当然,您可以手动执行此操作,将字符串解析为对象并从对象输出字符串,但这将是更多的工作
客户端提交JSON,在转换之后,您将拥有可以处理的Java对象。您可以将它们保存在应用程序范围映射的内存中,或者将它们写入文件或数据库中,然后再次更改它们的表示形式
您的应用程序将URL绑定到将请求表示形式转换为对象的特定操作,对对象执行操作,然后将它们返回,以便再次转换为客户机期望的表示形式
以上只是一些基本的解释。如果您遵循一些(例如快速搜索或返回),您的所有问题都可以得到回答。我相信还有很多其他问题。你的问题太开放了,所以当你遇到路障时,你只需深入挖掘并回答有关stackoverflow的具体问题
编辑:您似乎有点纠结于此,因此我将添加一项基本服务,让您开始使用,比如用户列表
到目前为止,你还没有提到你的服务级别。这是最重要的一点,比如:
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/api")
public class Test {
@GET
@Path("/users")
@Produces({ MediaType.APPLICATION_JSON })
public UsersResponseWrapper getUsers() {
List<User> users = new ArrayList<User>();
User u1 = new User();
u1.setId(1);
u1.setFullname("Joe Doe");
u1.setGender("M");
u1.setUsername("joe.doe");
u1.setBirthDate("1919-12-12");
User u2 = new User();
u2.setId(1);
u2.setFullname("John Smith");
u2.setGender("M");
u2.setUsername("john.smith");
u2.setBirthDate("1990-01-01");
users.add(u1);
users.add(u2);
UsersResponseWrapper resp = new UsersResponseWrapper();
resp.setMeta(new Meta(200));
resp.setData(users);
return resp;
}
}
JAXB提供程序:
package com.test;
import java.util.ArrayList;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
private static Class<?>[] types = {UsersResponseWrapper.class, User.class, Meta.class, ArrayList.class};
public JAXBContextResolver() throws Exception {
this.context = JAXBContext.newInstance(types);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
for (Class<?> type : types) {
if (type == objectType) {
return context;
}
}
return null;
}
}
这差不多是我可以补充的细节了<这毕竟是你的家庭作业:)。你做得很好,继续走 您的应用程序与用户协同工作。这是您的应用程序处理的资源,您的客户机与之交互以创建、更新、删除和获取(基本上) 但是用户是一种抽象资源,因此您的服务器和客户端通过使用来相互交互。表示可以是JSON格式(如您的示例所示)、XML等。您的客户机指定它想要的表示类型,服务器通过
内容类型
指定它返回的表示类型。请求/响应的主体与内容类型匹配
这是一个Java应用程序,因此在应用程序代码中,用户被表示为Java对象。您需要将请求/响应主体转换为具有getter和setter的对象。当然,您可以手动执行此操作,将字符串解析为对象并从对象输出字符串,但这将是更多的工作
客户端提交JSON,在转换之后,您将拥有可以处理的Java对象。您可以将它们保存在应用程序范围映射的内存中,或者将它们写入文件或数据库中,然后再次更改它们的表示形式
您的应用程序将URL绑定到将请求表示形式转换为对象的特定操作,对对象执行操作,然后将它们返回,以便再次转换为客户机期望的表示形式
以上只是一些基本的解释。如果您遵循一些(例如快速搜索或返回),您的所有问题都可以得到回答。我相信还有很多其他问题。你的问题太开放了,所以当你遇到路障时,你只需深入挖掘并回答有关stackoverflow的具体问题
编辑:您似乎有点纠结于此,因此我将添加一项基本服务,让您开始使用,比如用户列表
到目前为止,你还没有提到你的服务级别。这是最重要的一点,比如:
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/api")
public class Test {
@GET
@Path("/users")
@Produces({ MediaType.APPLICATION_JSON })
public UsersResponseWrapper getUsers() {
List<User> users = new ArrayList<User>();
User u1 = new User();
u1.setId(1);
u1.setFullname("Joe Doe");
u1.setGender("M");
u1.setUsername("joe.doe");
u1.setBirthDate("1919-12-12");
User u2 = new User();
u2.setId(1);
u2.setFullname("John Smith");
u2.setGender("M");
u2.setUsername("john.smith");
u2.setBirthDate("1990-01-01");
users.add(u1);
users.add(u2);
UsersResponseWrapper resp = new UsersResponseWrapper();
resp.setMeta(new Meta(200));
resp.setData(users);
return resp;
}
}
JAXB prov
package com.test;
import java.util.ArrayList;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
private static Class<?>[] types = {UsersResponseWrapper.class, User.class, Meta.class, ArrayList.class};
public JAXBContextResolver() throws Exception {
this.context = JAXBContext.newInstance(types);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
for (Class<?> type : types) {
if (type == objectType) {
return context;
}
}
return null;
}
}
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>RestService</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>com.test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>RestService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
package com.test;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class UsersResponseWrapper {
private Meta meta;
private List<User> data;
public Meta getMeta() {
return meta;
}
public void setMeta(Meta meta) {
this.meta = meta;
}
public List<User> getData() {
return data;
}
public void setData(List<User> data) {
this.data = data;
}
}
{
"data": [
{
"birthDate": "1919-12-12",
"fullname": "Joe Doe",
"gender": "M",
"id": "1",
"username": "joe.doe"
},
{
"birthDate": "1990-01-01",
"fullname": "John Smith",
"gender": "M",
"id": "1",
"username": "john.smith"
}
],
"meta": {
"code": "200"
}
}