在大部分的情況下,使用客戶端開發時呼叫Bmob的服務是比較常見的,比如開發Android、iOS應用程式等等。這樣做能夠直接省去服務端開發該做的事情,一方面降低了開發成本,另一方面也提高了客戶端開發的速度,對於開發人員來說真的是一樹百穫啊。
上面說的這些大家不要認為是在打廣告或是寫軟文,其實純粹就是一個普通使用者對一個產品使用後的真實感受的表達,如果你非要這樣認為,就怪程式設計師不太會用社會語言寫文章吧。好了,還是少解釋,我們們坐下來開始聊程式碼吧。
使用到的資源
SpringBoot專案
本來是想從建立SpringBoot專案開始講的,想想還是算了(主要是懶),因為基本都是IDEA的步驟說明,都是截圖,其實都不是這篇文章的重點。所以,這裡就主要說明一下專案所使用的類庫有哪些,專案是由maven構建的,pom.xml檔案中dependencies部分具體配置如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>複製程式碼
主要是spring-boot-starter-web,因為是一個web專案所以是必須的。
其次是fastjson,主要是用於Json資料的轉換處理。
另一個lombok,是我比較喜歡用的一個庫,基本是每個專案必備,它能讓我寫程式碼更加簡潔和方便,提高效率,這裡也強烈推薦給大家,具體的使用和介紹,可以自行Google瞭解。
編寫Config類
工程的基本結構如上圖所示,在基礎的SpringBoot專案上新建了DemoConfig.java、DemoController.java兩個類,接下來一一介紹,首先是DemoConfig.java類。
package tech.googol.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class DemoConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}複製程式碼
使用@Configuration註解標識DemoConfig類是一個配置類,SpringBoot會自動處理此標識下的相關配置,其中我們使用@Bean註解在restTemplate方法上,表示將該方法返回的RestTemplate例項交由Spring上下文管理,這樣就可以在需要使用RestTemplate的地方通過@Autowired註解來呼叫這個例項進行使用了。
編寫Controller類
下面就看看怎麼在DemoController類中使用RestTemplate物件來呼叫BmobRestfulAPI吧。
package tech.googol.demo;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@Slf4j
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
//Bmob獲取伺服器時間的介面地址
String url = "https://api.bmob.cn/1/timestamp";
@GetMapping("/time")
public ResponseEntity getServiceTime(){
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("X-Bmob-Application-Id", "4b5f22926******312c2f1e027c4071e");
headers.add("X-Bmob-REST-API-Key", "4af231ed9******bcb9ab847af29a7f4");
HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
ResponseEntity<JSONObject> result = restTemplate.exchange(url, HttpMethod.GET, requestEntity, JSONObject.class);
return result;
}
}複製程式碼
這裡先簡單的用一個方法來呼叫Bmob的獲取伺服器時間的介面,如果能正常返回伺服器時間,那麼則表示呼叫Bmob服務介面是成功的。
@RestController註解是Spring4之後新加入的註解,它是@ResponseBody和@Controller的組合註解。因為只是為了做一個RestfulAPI專案,不是普通的Web專案,不需要做檢視頁面的跳轉,所以直接使用@RestController,而不使用@Controller。
@Autowired註解自動裝配RestTemplate物件到DemoController類中以供使用。
@GetMapping註解也是Spring4引入的一個組合註解,它是@RequestMapping(method = RequestMethod.GET)的縮寫。@GetMapping("/time")表示提供一個GET請求方式的"/time"介面,該介面具體的實現在getServiceTime()方法中完成。
在這裡我們在getServiceTime()方法中使用restTemplate物件呼叫了Bmob的獲取伺服器時間介面
api.bmob.cn/1/timestamp,並將介面返回的資料直接return出去,也就是作為"/time"介面的資料返回。
RestTemplate的使用
這裡重點講一下RestTemplate請求BmobApi的部分。
使用的是RestTemplate物件的exchange方法來發起一次Http請求,第一個引數是請求的介面地址,第二個引數是Http請求的方式HttpMethod.GET,第三個引數是本次請求所傳入的引數,這裡是將介面所需的Header引數通過新增到HttpEntity物件中進行傳入的,第四個引數是本次請求response返回資料的封裝格式,這裡是封裝成JsonObject物件進行返回。
簡單封裝一下
上面只是為了快速檢驗一下能否正常請求和響應資料,所以所有的事情都在一個方法中解決了。這也是絕大多數程式設計師在開發過程中經常會做的事情,為了驗證一個想法是否可行,會先以簡單快速的方法去實踐,確認可行後再展開更加詳細的架構設計。
這裡我們就一步一步來,先將getServiceTime方法的實現進行拆分一下,儘量達到程式碼的可重用性,因為呼叫任何BmobRestfulAPI時,Header中都必須傳遞兩個引數X-Bmob-Application-Id、X-Bmob-REST-API-Key,並且需要制定Content-Type為"application/json",所以我們可以先將這部分的程式碼單獨拿出來在另一個方法中實現,暫且命名為generateRequestEntity方法,並過載一個無參的,以方便在請求BmobRestfulAPI時需要在body中傳遞引數和不需要傳參的情形進行使用。
private HttpEntity generateRequestEntity(){
return generateRequestEntity(null);
}
private HttpEntity generateRequestEntity(Object bodyData){
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("X-Bmob-Application-Id", "4b5f22926******312c2f1e027c4071e");
headers.add("X-Bmob-REST-API-Key", "4af231ed9******bcb9ab847af29a7f4");
HttpEntity<Object> requestEntity;
if(null != bodyData){
requestEntity = new HttpEntity<Object>(bodyData, headers);
}else{
requestEntity = new HttpEntity<Object>(headers);
}
return requestEntity;
}複製程式碼
測試
啟動SpringBoot專案,在瀏覽器直接訪問http://localhost:8080/time
介面,以Json格式返回Bmob伺服器時間。下圖為IDEA中使用REST Client訪問返回的結果:
總結
本文主要講解了怎樣在SpringBoot專案中訪問BmobApi介面這一個知識點,通過使用RestTemplate訪問獲取伺服器時間的介面,完成了一次簡單的Http Get請求,並正確得到伺服器返回的資料結果,這讓我們對接下來使用BmobApi的其他介面提供了可靠的保證,最後祝大家程式設計愉快。