【SpringCloud】微服務前置知識點:restful API dependencies和dependencyManager的區別

Jon_hao發表於2020-11-23

1.Restful Api

1.1介紹

1.Representational State Transfer 直接翻譯:表現層狀態轉移
2.REST描述的是在網路中client和server的一種互動形式;REST本身不實用,實用的是如何設計 RESTful API(REST風格的網路介面);
3.Server提供的RESTful API中,URL中只使用名詞來指定資源,原則上不使用動詞。“資源”是REST架構或者說整個網路處理的核心

1.2 以前URL與Rest的URL的區別

以前的URL,結尾一般是動詞來體現動作

http://localhost:8080/demo01/person/add.do(動詞,體現動作)

現在的Restful的URL,結尾是資源,比如id的值, 遮蔽了因為語言的不同,而導致多個系統之間不統一,就不要考慮帶不帶jsp,或者php字尾

根據請求方式來區分來表示不同的動作
method = {RequestMethod.GET}) 查詢/獲取資源
method = {RequestMethod.POST}) 新建資源(也可以用於更新資源)
method = {RequestMethod.DELETE}) 刪除資源
method = {RequestMethod.PUT}) 更新資源
在這裡插入圖片描述

http://localhost:8080/demo01/person/newuser(名詞 體現資源)

對比程式碼

{id} {}表示在地址上的佔位符 與# $類似
@PathVariable註解 表示取地址上的值 如@PathVariable int id
特別提醒
一般path = “user/{id}” 與 @PathVariable int id 要欄位要相同都是id
如果不相同 可以@PathVariable(“id”) int userid 來補救

package com.zx.demo01restful.controller;

import com.zx.demo01restful.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class UserController {

    @RequestMapping(path = "user/find.do",method = {RequestMethod.GET})
    public Object test01(int id){
       User user= new User();
       user.setId(id);
       user.setUsername("jack");
       user.setPassword("123456");
       return user;
    }

    @RequestMapping(path = "user/{id}",method = {RequestMethod.GET})
    public Object test02(@PathVariable int id){
        log.info("取到的id為:"+id);
        User user= new User();
        user.setId(id);
        user.setUsername("jack");
        user.setPassword("123456");
        return user;
    }

    @RequestMapping(path = "user/{id}",method = {RequestMethod.DELETE})
    public Object test03(@PathVariable int id){
        log.info("刪除了id:"+id);

        User user= new User();
        user.setId(id);
        user.setUsername("jack");
        user.setPassword("123456");
        return user;
    }
}

1.3 RestTemplate

RestTemplate類似postman 可以模擬http請求

介紹

1.spring 提供了RestTemplate的工具類對上述的3種http客戶端工具類進行了封裝,可在spring專案中使用RestTemplate進行服務呼叫。
2.三種http客戶端工具類包都
httpClient apache
okHttp
JDK原生URLConnection java
3.使用restTemplate訪問restful介面非常的簡單粗暴無腦。

請求地址 + 請求方式
請求引數
返回值
使用restTemplate訪問restful介面非常的簡單粗暴無腦。
postForObject(url, requestMap, ResponseBean.class)
參1 請求地址
參2 請求引數
參3 HTTP響應轉換被轉換成的物件型別
在這裡插入圖片描述

Demo02restTemplateApplicationTests

package com.zx.demo02rest_template;

import com.zx.demo02rest_template.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.client.RestTemplate;

@SpringBootTest
@Slf4j
class Demo02restTemplateApplicationTests {

    @Test
    void test01() {
        RestTemplate template=new RestTemplate();
        template.delete("http://localhost:8080/user/3");
    }

    @Test
    void test02() {
        RestTemplate template=new RestTemplate();
        User user=template.getForObject("http://localhost:8080/user/3", User.class);
        log.info("user物件:"+user);
    }
}

2.dependencies和dependencyManager的區別(其實我感覺dependencyManager有點雞肋)

2.1dependencise

是pom.xml元素,表示依賴項的集合
在父子工程中使用,所有生命在dependencies裡的依賴都會自動引入,並預設被所有的子專案繼承。

2.2dependencyManager

**用於管理jar包的版本,**讓子專案中引用一個依賴而不用顯示的列出版本號。

原理:Maven會沿著父子層次向上走,直到找到一個擁有dependencyManagement元素的專案,然後它就會使用在這個dependencyManagement元素中指定的版本號
但是子專案還得寫依賴,但不寫版本 本質上是宣告依賴與版本(只是說有這個東西,但沒有真正加進來)
父工程

  <!--宣告(鎖定jar的版本)mysql,但是不將mysql引入到父工程中 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

子工程不用寫版本號

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

2.3區別

(1)dependencies即使在子專案中不寫該依賴項,那麼子專案仍然會從父專案中繼承該依賴項(全部繼承)
(2)dependencyManagement裡只是宣告依賴,並不實現引入,因此子專案需要顯示的宣告需要用的依賴。
如果不在子專案中宣告依賴,是不會從父專案中繼承下來的;
只有在子專案中寫了該依賴項,並且沒有指定具體版本,才會從父專案中繼承該項,並且version和scope都讀取自父pom;
另外如果子專案中指定了版本號,那麼會使用子專案中指定的jar版本。
在這裡插入圖片描述

相關文章