SpringBoot消費BmobAPI

小小琪bmob後端雲發表於2017-11-24

在大部分的情況下,使用客戶端開發時呼叫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的其他介面提供了可靠的保證,最後祝大家程式設計愉快。

相關文章