精华内容
下载资源
问答
  • 如何编写后端接口

    万次阅读 多人点赞 2019-12-05 15:47:37
    如何编写后端接口 一、接口的设计与规划 好的程序,一定有一套合理的后端接口。在设计后端接口的时候,要考虑清楚各个方面的需求,最好能有一个操作流程作为指导。 二、使用eclipse创建一个能够连接数据库的...

    如何编写后端接口

    一、接口的设计与规划

    好的程序,一定有一套合理的后端接口。在设计后端接口的时候,要考虑清楚各个方面的需求,最好能有一个操作流程作为指导。

    二、使用eclipse创建一个能够连接数据库的spring boot项目

    插件安装
    Help
    Eclipse Marketplace...
    Spring Tool Suite STS for Eclipse
    安装
    完成
    file
    new
    spring starter project
    填写名称
    选则依赖
    MySQL Driver
    Spring Data JPA
    Spring Web
    完成

    打开eclipse,若没有插件,则安装。file->new->spring starter project->填写名称等基本信息->选则依赖(MySQL Driver,Spring Data Jpa,Spring Web)->完成
    等程序运行完成(看右下角),就创建好了!
    若是pom.xml文件第一行报错:Unknown,则将Spring Boot Version改小,可以改成2.1.4.RELEASE。

    三、编写数据库连接,日志输出

    将resource文件夹下的application.properties改成application.yml,并加入logback-spring.xml文件。
    application.yml

    server:
      port: 8080
    spring:
      http:
        encoding:
          charset: utf8
          enabled: true
          force: true
      jmx:
        enabled: false
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/zuoshi?serverTimezone=GMT%2B8&characterEncoding=UTF-8
        username: 
        password: 
      jpa:
        database: MYSQL
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQL5InnoDBDialect 
            hbm2ddl: 
              auto: update
        hibernate:
          ddl-auto: update
        show-sql: true
    ##配置日志
    logging:
        # 日志配置文件
        config: classpath:logback-spring.xml
        # 日志path路径配置
        path: ..\poem\logger
    

    logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!-- 配置日志按天生成文件 S -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <Prudent>true</Prudent>
            <rollingPolicy  class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${LOG_PATH}/info-%d{yyyy-MM-dd}.log </FileNamePattern>
                <MaxHistory>60</MaxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n </Pattern>
            </layout>
        </appender>
        <!-- 配置日志按天生成文件 E -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%date %-5level [%thread] %logger{100}[%line] - %msg%n</pattern>
            </encoder>
        </appender>
        <logger name="com.gome" level="INFO"/>
        <logger name="org.apache" level="WARN"/>
        <logger name="com.alibaba" level="INFO"/>
        <logger name="com.alibaba.dubbo" level="INFO"/>
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="org.springframework.test" level="INFO"/>
        <logger name="org.springframework.boot" level="INFO"/>
        <logger name="org.springframework" level="INFO"/>
        <logger name="jdbc" level="WARN"/>
        <logger name="jdbc.sqltiming" level="DEBUG"/>
        <logger name="org.mybatis" level="WARN"/>
        <logger name="org.spring.jdbc" level="WARN"/>
        <!--
         其中appender的配置表示打印到控制台(稍后详细讲解appender );
         <root level="INFO">将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。
        -->
        <root level="INFO">
            <appender-ref ref="FILE"/>
            <appender-ref ref="STDOUT"/>
        </root>
    </configuration>

    四、编写entity(关联数据库的类)

    每个entity对应数据库里的一张表,注意在类头上添加注解:@Entity,@Table(name=“entity”),每个属性对应一个字段,主键上添加注解:@Id,@GeneratedValue(strategy = GenerationType.IDENTITY),文本类型属性添加注解:@Column(name = “user_pwd”, nullable = false, length = 20),boolean类型属性,添加注解:@Column(name = “is_delete”, nullable = false),时间类型属性添加注解:@Column(name = “create_time”,nullable = false)@Temporal(TemporalType.TIMESTAMP)。

    五、编写repository(数据库查询接口)

    repository是一个很好用的,查询数据库的接口。注意在类头上写上注解:@Repository,@Transactional。只要按照命名规范去写,这个接口就不需要实现,可以直接调用。有三个函数特别管用(注意该类的继承关系):

    @Repository
    @Transactional
    public interface ArticleRepository extends JpaRepository<Article, Integer>{
     Optional<Article> findById(Integer id);//按照主键查找
     void deleteById(Integer id);//按照主键删除
     @SuppressWarnings("unchecked")
     Article saveAndFlush(Article article);//保存并更新
    }

    六、编写service(服务层的接口)

    服务层直接和数据层交互,可以把一些元操作变成接口,以便控制层调用。

    七、编写serviceimpl(服务层接口的实现)

    注意类头上的注解:@Service,既然是接口的实现,那么,需要implements接口,然后将接口里的函数引入。声明一个repository的实例,并且加上注解:@Autowired,加上如下的代码:

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    public Session getSession() {
      Configuration cfg = new Configuration();
      cfg.configure("/hibernate.cfg.xml");
      StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder();
      builder.applySettings(cfg.getProperties());
      SessionFactory factory = cfg.buildSessionFactory(builder.build());
      return factory.openSession();
     }

    接下来使用hql语法进行数据库的操作:

    Session session = getSession();
    String hql = "select count(*) from Article where titleId = :index";
    Query query = session.createQuery(hql).setParameter("index", bookId);
    Integer count = (Integer) query.uniqueResult();
       
    String hqltwo = "update Article set chapterId = chapterId + 1 where chapterId >= :first and chapterId < last and titleId = :bookId";
    session.createQuery(hqltwo).setParameter("first", chapterId).setParameter("last", count).setParameter("bookId", bookId);

    八、编写controller(暴露给用户使用的接口,实际是一个类)

    类头上写上注解和接口路径:@RestController,@RequestMapping("/rest/article"),每个方法上方,写上接口路径注解和返回JSON格式的注解:@RequestMapping("/throughArticle"),
    @ResponseBody,注意创建一个serviceimpl的实例,加上@Autowired注解;

    九、关于异常捕获

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    @ResponseBody
    public class myException {
     //1登录失败2读取失败3创建失败4修改失败5加载失败6加入失败7删除失败8返回失败9请重新登录
     private String NullPointerExceptionStr="空指针异常";
        private String ArrayIndexOutOfBoundsStr="数组越界异常";
        private String ClassCastExceptionStr="类型转换异常";
        private int ERROR_CODE = 400;
        
        static Logger logger = LoggerFactory.getLogger(myException.class);
        //空指针异常
        @ExceptionHandler(NullPointerException.class)
        public ReturnData nullPointerExceptionHandler(NullPointerException ex) {
            return resultFormat(ERROR_CODE, new Exception(NullPointerExceptionStr));
        }
        //类型转换异常
        @ExceptionHandler(ClassCastException.class)
        public ReturnData classCastExceptionHandler(ClassCastException ex) {
            return resultFormat(ERROR_CODE,  new Exception(ClassCastExceptionStr));
        }
        //数组越界异常
        @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
        public ReturnData ArrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException ex) {
            return resultFormat(ERROR_CODE, new Exception(ArrayIndexOutOfBoundsStr));
        }
        //其他错误
        @ExceptionHandler({Exception.class})
        public ReturnData exception(Exception ex) {
         ex.printStackTrace();
         logger.info(ex.getMessage());
            return resultFormat(ERROR_CODE, new Exception(ResponseCode.SYSTEMBUSY.getMsg()));
        }
        //自定义错误
        public static ReturnData toException(Integer code, String msg) {
         logger.info(msg);
         return ReturnData.build(code, msg);
        }
        private <T extends Throwable> ReturnData resultFormat(Integer code, T ex) {
            ex.printStackTrace();
            return ReturnData.build(code, ex.getMessage());
        }
    }

    其中,ReturnData 是自定义的数据存储输出类。

    十、关于跨域的问题

    新增加config路径,写过滤器:

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    public class MyInterceptor extends HandlerInterceptorAdapter{
        static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {         
      response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));        
      response.setHeader("Access-Control-Allow-Methods", "*");        
      response.setHeader("Access-Control-Allow-Credentials", "true");
      response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,Content-Type");
      response.setHeader("Access-Control-Max-Age", "3600");
      System.err.println("------------------>:已完成跨域处理");  
      logger.info("已完成跨域处理!");
      return true;    
      }
    }
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class MyWebConfigurer implements WebMvcConfigurer{
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new MyInterceptor())
      .addPathPatterns("/**");
     }
     @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**");
        }
    }

    在controller类头上加上跨域注解:@CrossOrigin。

    十一、数据的传递

    自定义的数据传递类,需要包含三个部分:
    一、执行结果状态;
    二、执行结果状态描述;
    三、执行结果(Object类型);

    十二、服务器上tomcat的设置

    1、如何使用域名访问网站?
    (1)config->server.xml更改:把8080端口改成80;
    (2)修改

    <Engine name="Catalina" defaultHost="localhost">
    

    <Engine name="Catalina" defaultHost="www.test.com">
    

    (3)找到host标签,修改为:

    <Host name="www.test.com"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="xxxx"/><!--xxxx就是在webapps下面xxxx.war的名字-->
        <Alias>test.com</Alias><!--如果没带www域名也配置好映射了就加上这个-->
    

    (4)重启tomcat服务;
    2、一个tomcat部署多个项目
    (1)tomcat路径下,新建一个文件夹,以区别于webapps文件夹,用于存放第二个项目;
    (2)server.xml里,加入一个新的Service(可以拷贝后修改参数);
    (3)注意:两个项目不能使用同一个端口,项目存放的文件夹需要修改;

    十三、利用tomcat部署程序到服务器上

    spring boot项目打包成war包:
    (1)pom.xml里边配置:

    <packaging>war</packaging>;
    

    (2)pom.xml里边,撤销嵌入的tomcat:在web的dependency下边:

    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
    

    (3)添加servlet依赖:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    

    (4)添加SpringBootApplication启动类:

    /**
     * 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
     */
    public class SpringBootStartApplication extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            // 注意这里要指向原先用main方法执行的Application启动类
            return builder.sources(Application.class);
        }
    }

    (5)右键工程:Run as->Maven build…->Goals里边填上:clean package->确定;
    (6)在target文件夹下能找到打包好的war包;

    十四、运行程序

    去掉war包的后缀(工程名.war),放到部署好的文件夹下边(一般为webapps),启动tomcat就好了。

    十五、几个eclipse的使用技巧

    1、自动提示的设置

    Window
    Preferences
    Java
    Editor
    Content Assist
    勾上Enable auto activation
    第二个加上26个字母
    完成

    26个字母不用区分大小写。
    2、自动注释的设置

    Window
    Preferences
    Java
    Code Style
    Code Templates
    完成

    通过Alt+Shift+J自动添加注释。
    3、@GeneratedValue注解
    strategy属性提供四种值:
    AUTO主键由程序控制, 是默认选项 ,不设置就是这个;
    IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式;
    SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持;
    Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植。
    4、打开数据库的几种方式
    ddl-auto:create:每次运行该程序,没有表格会新建表格,表内有数据会清空
    ddl-auto:create-drop:每次程序结束的时候会清空表
    ddl-auto:update:每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
    ddl-auto:validate:运行程序会校验数据与数据库的字段类型是否相同,不同会报错
    5、@Controller与@RestController
    Controller可以返回网页,RestController返回的是数据。
    6、网页接口与后端接口的区别
    网页接口需要使用thymleaf模板,引入如下依赖:

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    

    后端接口则直接使用POSTMAN访问测试。
    7、@ResponseBody
    让结果类按照JSON字符串的形式返回。

    十六、eclipse常见问题

    1、系统找不到menifest.mf:找到xmlns中间的空格,先回车,再复原,就好了。
    2、eclipse自动生成get和set:右键->source->Generate Getters and Setters…
    3、org.springframework包报错:
    pom.xml里边加入:

      <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>4.3.2.RELEASE</version>
      </dependency>
    

    4、Archive for required library: “xxxx” in project ‘*’ cannot be read or is not a valid ZIP file:删除路径下的整个文件夹,然后项目右键->Run as->Maven Install,最后update项目。
    5、spring boot数据库:关键字,如user,limit,delete等,不能作为表名,字段名或者出现在需要自定义的地方;

    展开全文
  • Java数据接口编写简单例子,Java Web Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据。 目前主流的CS结构,数据都是通过RESTful风格接口形式呈现,不管是桌面级应用程序还是手机端,接口是我们...

    实现效果


    实现原因

    目前主流的CS结构,数据都是通过RESTful风格接口形式呈现,不管是桌面级应用程序还是手机端,接口是我们获取数据的大多数选择, 主流数据接口呈现形式主要是Json和Xml,后者目前基本渐行渐远。Json的轻量级和可读型成为了大多数公司及个人开发者的第一选择。
    主流公司在编写数据接口时大多通过框架实现,如RESTEasy、Retrofit等,在这里通过简单的java web代码写一个简单的接口项目例子供大家参考,后附项目源代码。



    实现步骤

    在Eclipse中新建项目JsonTest项目,项目结构如下,

    此处主要用到的类只有几个,其他类为Json测试用类,此处可以忽略。


    在lib下导入或在maven中引用gson-2.6.2.jar包和servlet-api.jar包。

    gson此处用于将持久化对象解析为Json,或将Json序列化为对象。

    servlet-api用于servlet相关类创建及API运用。



    关于gson,是Google开源项目下的一个Java Json解析工具包,具体使用及详细信息可以看这篇文章:Gson简要使用




    步骤一:新建测试用Model类

    新建新闻测试类News,主要用于数据模型测试显示,Json转换测试等,代码如下:

    import java.util.Date;
    
    public class News {
    
    	private int nId; // 新闻ID
    	private String title; // 新闻标题
    	private String content; // 新闻内容
    	private String date; // 新闻发布日期
    	private String url; //新闻地址
    	private Date nDate; // 新闻日期,Date类型
    
    	public News(int nId, String title, String content, String date, String url) {
    		this.nId = nId;
    		this.title = title;
    		this.content = content;
    		this.date = date;
    		this.url = url;
    	}
    
    	public News() {
    	}
    
    	public News(int nId, String title, String content, Date nDate, String url) {
    		this.nId = nId;
    		this.title = title;
    		this.content = content;
    		this.nDate = nDate;
    		this.url = url;
    	}
    
    	
    	
    	public String getUrl() {
    		return url;
    	}
    
    	public void setUrl(String url) {
    		this.url = url;
    	}
    
    	public Date getnDate() {
    		return nDate;
    	}
    
    	public void setnDate(Date nDate) {
    		this.nDate = nDate;
    	}
    
    	public int getnId() {
    		return nId;
    	}
    
    	public void setnId(int nId) {
    		this.nId = nId;
    	}
    
    	public String getTitle() {
    		return title;
    	}
    
    	public void setTitle(String title) {
    		this.title = title;
    	}
    
    	public String getContent() {
    		return content;
    	}
    
    	public void setContent(String content) {
    		this.content = content;
    	}
    
    	public String getDate() {
    		return date;
    	}
    
    	public void setDate(String date) {
    		this.date = date;
    	}
    
    }
    新建分页测试类NewTotal,主要用于Json分页显示,代码如下:
    import java.util.List;
    
    public class NewTotal {
    	private int total; //新闻数量
    	private List<News> rows; //新闻列表
    	
    	
    	public NewTotal() {
    	}
    	public NewTotal(int total, List<News> rows) {
    		this.total = total;
    		this.rows = rows;
    	}
    	public int getTotal() {
    		return total;
    	}
    	public void setTotal(int total) {
    		this.total = total;
    	}
    	public List<News> getRows() {
    		return rows;
    	}
    	public void setRows(List<News> rows) {
    		this.rows = rows;
    	}
    	
    	
    }


    步骤二:添加测试用Action和JSP界面

    新建JsonServlet,继承自HttpServlet,具体代码详解已经在代码中注释:

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.google.gson.Gson;
    import com.test.model.NewTotal;
    import com.test.model.News;
    
    public class JsonServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// 创建多个新闻类,模拟从数据库获取数据,可将此处改为用JDBC从数据库读取数据
    		News new1 = new News(110, "日本地震", "日本福田发生了7级地震", "2016-5-16 10:22:20",
    				"http://world.huanqiu.com/exclusive/2016-05/8974294.html");
    		News new2 = new News(111, "Apple库克第八次访华", "近日库克第八次访华,与滴滴高层会谈", "2016-5-16 10:22:20",
    				"http://mobile.163.com/16/0523/09/BNO7SG2B001168BQ.html");
    		News new3 = new News(113, "Google I/O大会开幕", "Google开发者大会即将举办,是否推出Android7.0?", "2016-5-16 10:22:20",
    				"http://www.ithome.com/html/android/227647.htm");
    		News new4 = new News(114, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20",
    				"http://news.mydrivers.com/1/484/484072.htm");
    		News new5 = new News(115, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new6 = new News(116, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new7 = new News(117, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new8 = new News(118, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new9 = new News(119, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new10 = new News(120, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new11 = new News(121, "获取新数据!!!!!!", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new12 = new News(122, "获取新数据!!!!!!", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new13 = new News(123, "获取新数据!!!!!!", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new14 = new News(124, "获取新数据!!!!!!", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new15 = new News(125, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new16 = new News(126, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new17 = new News(127, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new18 = new News(128, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new19 = new News(129, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    		News new20 = new News(130, "格力营收下滑400亿", "格里营收下滑400亿,董明珠说我活得好的很", "2016-5-16 10:22:20", "www.baidu.com");
    
    		String page = req.getParameter("page");
    		// 将数据添加到数组
    		List<News> newslist = new ArrayList<News>();
    		if (page == null || page.equals("0")) {
    			newslist.add(new1);
    			newslist.add(new2);
    			newslist.add(new3);
    			newslist.add(new4);
    			newslist.add(new5);
    			newslist.add(new6);
    			newslist.add(new7);
    			newslist.add(new8);
    			newslist.add(new9);
    			newslist.add(new10);
    		}
    		else {
    			newslist.add(new11);
    			newslist.add(new12);
    			newslist.add(new13);
    			newslist.add(new14);
    			newslist.add(new15);
    			newslist.add(new16);
    			newslist.add(new17);
    			newslist.add(new18);
    			newslist.add(new19);
    			newslist.add(new20);
    		}
    
    		// 将数据封装到新闻总计类
    		NewTotal nt = new NewTotal(newslist.size(), newslist);
    
    		// 调用GSON jar工具包封装好的toJson方法,可直接生成JSON字符串
    		Gson gson = new Gson();
    		String json = gson.toJson(nt);
    
    		// 输出到界面
    		System.out.println(json);
    		resp.setContentType("text/plain");
    		resp.setCharacterEncoding("gb2312");
    		PrintWriter out = new PrintWriter(resp.getOutputStream());
    		out.print(json);
    		out.flush();
    		// 更多Json转换使用请看JsonTest类
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		this.doGet(req, resp);
    	}
    
    }

    修改项目index.jsp页面如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>Test Json</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
         <form action="getJson" method="get">
         	<input type="submit" value="点击获取新闻JSON数据"/>
         </form>
      </body>
    </html>

    在项目中配置web.xml,注册JsonServlet映射,配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>JsonTest</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      
      <servlet>
          <servlet-name>JsonServlet</servlet-name>
          <servlet-class>com.test.json.JsonServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>JsonServlet</servlet-name>
          <url-pattern>/getJson</url-pattern>
      </servlet-mapping>
    </web-app>


    步骤三:添加项目到Tomcat容器,运行服务器

    运行服务器,在地址栏输入地址:http://localhost:8080/JsonTest/getJson?page=0,效果如图:


    其他关于JSON解析的也可以看我发布的源代码中的JsonTest类,获取源代码:JavaJson解析



    声明

    欢迎转载,但请保留文章原始出处
    作者:Jaiky_杰哥 
    出处:http://blog.csdn.net/jaikydota163/article/details/51458880

    展开全文
  • 如何编写接口文档

    千次阅读 2017-11-06 18:53:38
    一个简单的接口文档,写完给组长看后,发现漏洞百出。下面总结一下写文档需要注意事项:  封皮  封面最好是本公司规定的封面,有logo,内容标题,版本号,公司名称,文档产生日期。(错误地方在于,文档的标题要...
    一个简单的接口文档,写完给组长看后,发现漏洞百出。下面总结一下写文档需要注意事项: 
    

           封皮

           封面最好是本公司规定的封面,有logo,内容标题,版本号,公司名称,文档产生日期。(错误地方在于,文档的标题要和页眉中的标题一致)

           修订历史

           表格形式较好些。包括,版本,修订说明,修订日期,修订人,审核时间审核人。(我错误的地方在于,表格中其他空白表格没有居中)

           接口信息

           接口调用方式,是post方式还是get方式,接口地址,别人需要线上的哪个地址就写哪个。(自己提前测试好线上的这个接口,是否有其他问题,千万别犯低级的错误,尤其是某个字母写错)

           功能描述

           一定要清晰的描述接口功能。(不要遗漏一些细节,比如接口获取的信息不包括哪些哪些要写明白)

           接口参数说明

           每个参数都要和实际中调用的一样,包括大小写;参数的含义言简意赅的说明;格式,是string 还是int 还是long等格式(例如参数为@RequestParam("appKey") String appKey, @RequestParam("randomId") Integer randomId);说明部分,说明参数值是需要哪个公司提供,并详细说明参数怎么生成的,例如时间戳,是哪个时间段的;参数是否必填,一些参数是必须要有的,有些是可选参数,一定要注意写清晰。

           返回值说明

           1、有一个模板返回值,并说明每个返回参数的意义。

           2、提供一个真实的调用接口,真实的返回值。


           接口调用限制,接口调用安全方面

           为了接口安全,我们可以进行md5加密方式,或者自己公司一个特殊的加密过程,只要双方采用一致的加密算法就可以调用接口,保证了接口调用的安全性。

           文档全局方面

           文档大标题的字体字号一致,小的分标题一致,正文部分字号也要一致。文章整体字的类别一致,我认为微软雅黑字体样式给人感觉比较清晰。文档目录,自动生成的目录会添加些许的修饰,去掉不整齐的部分,得到一个整齐的目录格式。

           文档维护

           文档在维护的时候,如有修改一定要写上修改日期,修改人,对大的修改要有版本号变更。

           好文档标准检验

           我认为检验一个文档写的是否好,主要还是在内容方面,内容是否仔细没有疏漏之处。是否发给别人使用的时候,无需沟通就能把接口调通。别人通过成功的把接口调通,这就是一个好文档。

           总结

           虽然对于敏捷开发来说项目不需要需求,设计,详细设计等文档,但是在和别的公司在调用接口的时候,是一定要总结成文档的,形成接口规范,文档规范。昨天看到微信分享的一篇文档,叫做《教养,就是让别人舒服》,我想在写文档的时候,把自己当做看文档的人,怎么写让别人舒服,我想这就是写文档的“教养”吧。
    展开全文
  • 1.注意事项 a.团队[协作开发]之间,要将需求搞明白. b.前期设计要做好[尽量后面需要很小的改动],特别是数据库的设计. c.团队之间充分讨论需求,并定到伪代码级别,不要急于代码实现. 例如,...

    文档

    https://mp.weixin.qq.com/s/2Ckis0gMiRM5MzE3ZtKXbg // 优秀API设计总结

    https://zhuanlan.zhihu.com/p/291134908 // 适合写API接口文档的管理工具有哪些?

    https://zhuanlan.zhihu.com/p/108355705 // 技术·文档 | 标准API文档规范 1.0

    https://www.jianshu.com/p/3f8953f73a79 // API接口规范

    1.注意事项

    a.团队[协作开发]之间,要将需求搞明白.

    b.前期设计要做好[尽量后面需要很小的改动],特别是数据库的设计.

    c.团队之间充分讨论需求,并定到伪代码级别,不要急于代码实现.

    例如,使用框架:

    将路由,控制器,模型,文件名,函数名,变量,参数,开发流程,分支及相关的命名规范确定下来.

    很多东西,前期约定好,可以避免后面出现的很多问题.看似花费很多时间,实际上是值得的.

    d.将所有的讨论,确定,约定的东西,都要落到文档上.

    对于前后端分离,接口的重要不言而喻.但是不止于接口,其他确定约定的都要落于文档.

    同时,一旦有改变就要立马修改文档,[需要讨论的,继续讨论,但是要控制时间,有效率的沟通]

    文档确定下来,严格按照文档执行,实在有问题,需要另行讨论约定.

    2.接口编写

    接口编写,应该清晰简洁,每个团队,应该结合自身情况确定文档的编写格式.

    推荐使用在线文档编写 如腾讯在线文档[https://docs.qq.com/desktop/  可设置分享给指定用户] 或者 自行开发一个接口文档系统,

    接口编写

    1.获取用户列表

    url: user/list

    请求方式: get

    请求参数: 无

    响应数据格式: json

    返回结果:

    //成功

    {

        "code":1,

        "msg":"success",

        "rows":[

            {

                "name":"test_name",

                "email":"1158885641@qq.com"

            },

            {

                "name":"test_name",

                "email":"1158885641@qq.com"

            }

        ]

    }

    //失败

    {

        "code":0,

        "msg":"failure!"

    }

    Note:

    至于code的取值,可以自行约定即可.

    3.markdown 语法文档实例参考

    可以参考网上很多格式, 这里暂不展示格式.

    4.接口测试

    工具: Postman

    https://www.cnblogs.com/mafly/p/postman.html  // Postman官网
    https://www.cnblogs.com/mafly/p/postman.html  // Postman 安装及使用入门教程

    5.问题

    1.如果接口请求异常,应该返回的响应是什么?

    [比如,我看到,很多服务的 API 出错不返回 HTTP 的错误状态码,而是返回个正常的状态码 200,然后在 HTTP Body 里的 JSON 字符串中写着个:error,bla bla error message。这简直就是一种反人类的做法。我实在不明白为什么会有众多这样的设计。这让监控怎么做啊?现在,你应该使用 Swagger 的规范了] --- 左耳听风

    TBD

    补充: //20200825 周二 科学馆

    如: 请求豆瓣的接口,可以作为参考. 有时候我们就是从借鉴模仿学习开始.

    https://api.douban.com/v2/movie/in_theaters

    {
        "msg":"invalid_apikey, Please contact bd-team@douban.com for authorized access.",
        "code":104,
        "request":"GET /v2/movie/in_theaters"
    }

    补充:

    小美:

    说下为什么API都返回200,在Body里写错误信息:因为有的运营商会拦截非200请求,然后返回广告😂

    denofiend:

    http header也会拦截

    2.后端服务[如果使用PHP开发],查询数据库异常,应该怎么处理? 返回给客户端的响应是什么?

    待实践:TBD

    后续补充

    ...

    6.参考

    https://mp.weixin.qq.com/s/2Ckis0gMiRM5MzE3ZtKXbg // 优秀API设计总结

    https://zhuanlan.zhihu.com/p/291134908 // 适合写API接口文档的管理工具有哪些?

    https://zhuanlan.zhihu.com/p/108355705 // 技术·文档 | 标准API文档规范 1.0

    https://www.cnblogs.com/mafly/p/postman.html  // Postman官网
    https://www.cnblogs.com/mafly/p/postman.html  // Postman 安装及使用入门教程

    后续补充

    ...

    展开全文
  • 如何设计和编写标准的后端接口

    千次阅读 2020-10-11 13:18:59
    如何设计和编写标准的后端接口
  • c++ 如何编写接口类(interface)

    万次阅读 多人点赞 2018-08-15 23:46:08
    用c++实现接口类时需要注意一下几点: 1、接口类中不应该声明成员变量,静态变量。 2、可以声明静态常量作为接口的返回值状态,需要在对应的cpp中定义并初始化,访问时需要使用"接口类型::静态常量名".....
  • 后端接口文档的编写

    千次阅读 2020-04-30 00:26:15
    后端接口文档的编写: 1. 为什么我们前端也要了解后端接口文档的一个编写过程? 作为一名前端FE[front end],前后端交互测试你必须懂。 是为了更好的前后端交互,工作流程的书写! 2. 接口文档编写方式很多 [常用]...
  • 一个项目 接口编写需要注意的地方

    千次阅读 2016-05-27 12:33:12
    1.项目接口编写注意项:  1.1 接口方面的函数要保证一个处理数据的函数是拆分到最小程度的函数,不要参杂其他的数据处理;  1.2 在处理数据前要先处理从客户端传回的数据是否正确以及是否有问题,无论客户端是否...
  • Jmeter基础之编写HTTP接口用例

    千次阅读 2018-05-26 17:47:26
    使用Jmeter书写一个接口用例 第一:添加线程组 一、添加一个线程组,方法如下图所示: 二、配置线程组,如下图图所示: 需要填写名称,按需要修改线程数、等待时间和循环次数等; 第二:添加http请求 一...
  • 编写REST风格接口注意

    千次阅读 2019-03-15 23:09:25
    https://blog.csdn.net/houjixin/article/details/54315835 就看这篇文章等待过两天总结。写了大概半年的restful接口,但是没有注意其中的注意点。多注意这些细节,你才能进步。 ...
  • 主要介绍了Python面向对象类编写细节,较为详细的分析了Python面向对象程序设计中类,方法,继承,超类,接口等相关概念、使用技巧与注意事项,需要的朋友可以参考下
  • Filter接口编写过滤器

    千次阅读 2019-01-31 14:22:08
    Filter接口编写过滤器  Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程。为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用...
  • 用PHP编写简单的api(数据接口

    万次阅读 2019-05-20 22:59:23
    一、编写接口所需几样工具或软件(均是win7+64位): 1.phpStudy、SQLyog和编码工具(sublime text/webStorm/vs code均可,按自己习惯来); 2.安装好phpStudy之后,打开软件,点击启动;如果Apache和MySQL右边的...
  • 使用Node.js Express 框架编写后台接口

    千次阅读 2018-12-08 19:35:16
    本次demo地址: ... 一,数据库建表; 本人用的phpStudy里的mysql数据库,管理工具就是用的自带的phpMyAdmin;...(后期有时间也会尝试开发php接口,虽然本人是一枚前端开发工程师) 可视化操作没什么可说...
  • 编写mapper接口遵循的开发规范

    千次阅读 2018-07-13 17:57:45
    1、在mapper.xml中namespace等于mapper接口地址2、mapper.java接口中的方法名和mapper.xml中的statement中的id一致3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。...
  • 如何编写一份接口文档

    万次阅读 2017-03-31 11:29:45
    编写一份基本的接口文件要注意以下几点: 1.一定要有版本号,因为基本上对应的接口都是刚开发或者待开发的(已经正常使用的接口也不需要你来写文档)不可能一次提供最终版,方便后续更改,同时避免因为修改多次导致...
  • junit基本介绍,junit常用的接口和类,如何编写测试代码,需要注意的几个问题
  • 在php中调用接口以及编写接口

    万次阅读 多人点赞 2015-12-09 09:37:05
    在这里openUser.php相当于一个接口,其中get_user_list 是一个API(获取用户列表),讲求返回的数据类型为JSON格式。 你只需要在你PHP代码中执行这条链接他就会返回。 GET方式的直接使用 $file_contents = ...
  • 我了解的编写接口的方式有: socket编程 servlet webservice http+json 对于上面的四种方式,基本上都能实现我目前的项目需求,可是我就是想知道用哪一个最合适,因此根据查阅资料以及自己的理解记录下自己的...
  • 接口测试中注意的问题

    千次阅读 2016-11-15 16:29:26
    在写脚本后注意及时清理接口测试过程中,向数据库或实时搜索中插入的数据,以免脚本的持续运行,会对数据库和实时搜索造成不必要的负担。2、 在编写脚本前,提前写好用例 接口测试虽然对代码的要求比较高,但是最终...
  • 【后台学习】编写后台接口

    万次阅读 多人点赞 2016-12-16 15:01:43
    1、MyEclipse+Maven+Tomcat安装与配置 2、MyEclipse创建Maven项目 3、MySQL安装与数据库创建 4、MyEclipse编写后台接口 /** * 控制层(目的是返给访问者数据) * @au
  • 该自动化平台分成两部分,web端负责测试用例编写及用例调度等.客户端用于具体执行用例. 客户端和服务器端的安装和配置请参考官网 http://www.luckyframe.cn/book/yhsc/syschyy-24.html 1.客户端配置 下载并解压...
  • MyBatis面试题(2020最新版)

    万次阅读 多人点赞 2019-09-24 16:40:33
    整理好的MyBatis面试题库,史上最全的MyBatis面试题,MyBatis面试宝典,特此分享给大家 MyBatis 介绍 MyBatis 是一款优秀的...MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plai...
  • RPC 框架,或者一部分人习惯称之为服务治理框架,更多的讨论是存在于其技术架构,比如 RPC 的实现原理,RPC 各个分层的意义,具体 RPC 框架的源码分析…但却并没有太多话题和“如何设计 RPC 接口”这样的业务架构...
  • 接口文档的编写

    千次阅读 2018-06-04 21:53:16
    作者:塔克拉玛干平原链接:...在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。二...
  • C++/C编写接口时需要注意

    千次阅读 2011-10-18 10:30:18
    2.首先了解使用你的库的人的编程习惯,如果他喜欢用char*而不是string,那么你需要根据他们的习惯来编写接口,这样比较容易使他们接收,当然首要遵守你们公司的规定; 3.如果你的库提供了创建对象或对象指针的方法...
  • 如何优雅的“编写”api接口文档

    万次阅读 2017-05-04 00:05:24
    注意版本,官网上的版本还没有更新到最新的,最新的在 Github 上看,配置后的代码 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBoot...
  • 在上一篇Android开发者编写自己的API接口(上)中,已经介绍了如何搭建一个基本的开发环境,以及接口编写,最后是能够成功运行的。 这一篇将更进一步,主要解决下面两个问题: ①:如何让后台项目运行在TomCat...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 498,495
精华内容 199,398
关键字:

编写接口注意