【接口】SpringBoot+接口開發(一)

1、接口的簡單介紹html

1.什麼是接口:接口及服務;java

2.接口的分類:(1)系統的內部接口;(2)第三方的外部接口;mysql

3.簡述接口原理圖:web

4.接口協議:是指客戶端跟服務器之間或者接口與接口間進行的通信時必需要聽從的約定和要求;spring

   互聯網上 應用最爲普遍的一種網絡協議--http協議(超文本傳輸協議),所以最多見的就是http協議的接口.(webservice接口,dubbo接口等都是基於http協議)sql

5.http協議的組成數據庫

請求:
1.url統一資源定位符(接口地址)
2.請求方式(get,post,put,delete)
3.請求參數
4.請求格式
5.請求頭:攜帶服務器關於客戶端的一些信息
6.協議版本
響應:
1.響應的狀態碼
2.響應頭:攜帶客關於服務器的一些信息給客戶端
3.響應報文

6.接口的本質json

  (1) 接口就是服務,功能的實現,本質就是基於某協議下實現的一個函數,例如登陸界面請求xxx/login.html地址的時候,經過路徑
   映射,請求到login()函數進行處理.
  (2) 接口的傳參對應了函數的參數(接口測試參數--函數參數),接口的響應報文對應了函數定義的返回值(接口響應報文--函數的返回值)api

2、引入微服務架構Spring Boot,咱們只須要導入咱們本次需求須要的依賴包便可!tomcat

 <!-- 引入springboot默認提供的一套依賴 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>
<dependencies>
    <!-- 提供了web模塊的依賴  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <!-- 熱部署  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
</dependencies>

注入:eclipse導入熱部署依賴後須要勾選項

導入mysql依賴:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

 3、代碼實現簡單接口功能以下:

1.get請求:http://IP:端口/user/login?username=xxx&password=123456
2.數據庫驗證,請求參數是否存在:username=xxx&password=123456,若是不存在提示檢查信息,若是存在登陸成功
2.json格式響應數據:{"status":"1","message":"登陸成功"}

1.新建Application類,SpringBoot入口程序

package cn.bing.starter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

/**Spring boot 入口啓動程序,sprint boot內置了tomcat
 * @author Administrator
 */
@ComponentScan(basePackages= {"cn.bing.api"})//掃描組件
@SpringBootApplication//定義sprintboot入口程序
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

2.實現SQL數據庫查詢工具類

(1)請根據本身實現狀況,配置鏈接數據庫參數jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/my_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
jdbc.username=sql-name
jdbc.password=sql-password

(2)實現SQlUtil工具類

package cn.bing.util;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Properties;

import cn.bing.pojo.User;

public class SQLUtil {
    /**
        *   靜態代碼塊加載後,用map來存儲jdbc鏈接數據庫的信息
     */
    public static HashMap<String, String> map = new HashMap<String, String>();
    static {
        //加載properties文件獲取鏈接SQL數據庫的參數
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream(new File("src/test/resources/jdbc.properties")));
        } catch (Exception e) {
            e.printStackTrace();
        } 
        map.put("url", properties.getProperty("jdbc.url"));
        map.put("name", properties.getProperty("jdbc.username"));
        map.put("pwd", properties.getProperty("jdbc.password"));
    }
    
    /**傳入user進入數據庫查詢是否存在,返回大於1存在,返回0則不存在
     * @param user
     */
    public static int findSQL(User user) {
        //根據SQL查詢結果爲數量num,假設沒有查到爲0
        int num =0;
        //取出須要查詢的數據username和password
        String username = user.getUsername();
        String password = user.getPassword();
        String sql ="select count(*) as number from user_test where name='"+username+"'"+"and password='"+password+"'";
        Connection connection =null;
        try {
            //1.建立鏈接
            connection = DriverManager.getConnection(map.get("url"),map.get("name"),map.get("pwd"));
            //2.得到一個statement對象,將要執行的sql腳本封裝到此對象中
            PreparedStatement statement =connection.prepareStatement(sql);
            ResultSet ResultSet = statement.executeQuery();
            while(ResultSet.next()) {
                num =ResultSet.getInt("number");
            }
        
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                connection.close();//關閉鏈接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return num;
    }
}

3.新建user對象

package cn.bing.pojo;

public class User {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    public User() {
        super();
    }    
}

4.新建Result對象,響應時=>序列化爲json格式返回

package cn.bing.pojo;
public class Result {
    //接口返回狀態標誌:1:表明接口正常處理,返回成功; 0:表明處理異常,返回失敗
    private String status;
    private String message;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Result(String status, String message) {
        super();
        this.status = status;
        this.message = message;
    }
    public Result() {
        super();
    }
    @Override
    public String toString() {
        return "Result [status=" + status + ", message=" + message + "]";
    }  
}

5.中央控制器的實現類

package cn.bing.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.bing.pojo.Result;
import cn.bing.pojo.User;
import cn.bing.util.SQLUtil;

/**controller:控制器(實現請求分發,通常會在控制器當中定義接口)
 * @author Administrator
 *
 */
@RestController//控制器類
@RequestMapping("/user")//映射路徑
public class UserController {
    //登陸接口 http://ip:端口/user/login
    @RequestMapping(value="/login")
    public Result login(User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        //1.用戶名爲空提示"用戶名不能爲空"
        if(username==null || username.trim().length()==0) {
            return new Result("0","用戶名不能爲空");
        }
        //2.密碼爲空,提示"密碼不能爲空"
        if(password==null || password.trim().length()==0) {
            return new Result("0","密碼不能爲空");
        }
        //3.用戶名密碼不爲空的狀況下jdbc完成數據庫查詢驗證
        if(username != null && password!=null) {
            int num = SQLUtil.findSQL(user);
            System.out.println("-------------------------"+num+"--------------------------------");
            if(num>0) {
                return new Result("1", "登陸成功");
            }
        }
        return new Result("0","請覈對帳密信息!");      
    }
}

四.運行Application類,啓動SpringBoot程序,訪問接口結果以下:

補充:數據庫保存用戶名及密碼截圖

5、擴展:

1.若是@RequestMapping(value="/login",method=RequestMethod.GET,僅支持get訪問

@RestController//控制器類
@RequestMapping("/user")//映射路徑
public class UserController {
    @RequestMapping(value="/login",method=RequestMethod.GET")
    public Result login(User user) {
    ... ...
}
}

2.若是@RequestMapping(value="/login",method=RequestMethod.POST),僅支持post訪問

@RestController//控制器類
@RequestMapping("/user")//映射路徑
public class UserController {
    @RequestMapping(value="/login",method=RequestMethod.POST")
    public Result login(User user) {
    ... ...
    } 
}

 

3.規定傳參格式:consumes="application/json"

4. @RequestBody須要把全部請求參數做爲json解析,所以,不能包含key=value這樣的寫法在請求url中,全部的請求參數都是一個json

//@RequestBody(required=false)
Whether body content is required. 
Default is true, leading to an exception thrown in case there is no body content. Switch this to false if you prefer null to be passed when the body content is null.
百度翻譯:默認值爲true,在沒有正文內容的狀況下會引起異常。若是您但願在正文內容爲null時傳遞null,請將其切換爲false。
@RestController//控制器類
@RequestMapping("/user")//映射路徑
public class UserController {
    @RequestMapping(value="/login",method=RequestMethod.POST,consumes="application/json")
    public Result login(@RequestBody(required=false)User user) {
    ... ...
  }
}

6、未完待優化。。。。。

相關文章
相關標籤/搜索