簡易的服務(wù)器接口開發(fā)入門教程

前言
為了解決服務(wù)器接口開發(fā)的問題,因此學(xué)習(xí)了關(guān)于Spring Boot的知識,然后再自己摸索總結(jié)后臺的開發(fā)經(jīng)驗。所以這篇文章就是面向搞移動開發(fā)同時又想了解后臺開發(fā)的朋友,講解如何使用Spring Boot開發(fā)服務(wù)器接口,然后在Android客戶端調(diào)用該接口進(jìn)行數(shù)據(jù)請求。
這里我挑出了幾個有時被大家忽略的幾條,但是它們在日常工作中會有很大幫助。
感謝各友的鼓勵與支持??????,往期文章都在最后梳理出來了(●'?'●)
????
Spring Boot特點(diǎn)
創(chuàng)建獨(dú)立的Spring應(yīng)用程序
嵌入的Tomcat,無需部署WAR文件
簡化Maven配置
自動配置Spring
提供生產(chǎn)就緒型功能,如指標(biāo),健康檢查和外部配置
絕對沒有代碼生成并且對XML也沒有配置要求
基本要求
熟悉Java語言
對Java Web開發(fā),Spring框架等有所了解
會Android開發(fā),熟悉常用的網(wǎng)絡(luò)請求框架
會使用IDEA,Android Studio開發(fā)工具
對網(wǎng)絡(luò)知識有所了解
擁有JDK 1.8的開發(fā)環(huán)境
服務(wù)器開發(fā)
現(xiàn)在開始進(jìn)行服務(wù)端的接口開發(fā),例子是當(dāng)客戶端上傳的用戶的昵稱,年齡,性別,服務(wù)端返回相關(guān)的數(shù)據(jù)。接口設(shè)計如下:
接口地址:http:// ip address :8080/api/test
返回格式:json
請求方式:http get/post
請求示例:
http:// ip address :8080/api/test?nickname=lake&age=20&gender=male接下來就是正式構(gòu)建服務(wù)器接口開發(fā)項目
開始使用IDEA構(gòu)建項目
一、啟動 IDEA,選擇"Create New Project"。

二、選擇"Spring Initializr",然后點(diǎn)擊"Next"。

三、這一步填寫好 Group 和 Artifact ,然后點(diǎn)擊"Next"。

四、勾選"Web"依賴,然后點(diǎn)擊"Next"。

五、選擇好項目創(chuàng)建的相關(guān)目錄位置,然后點(diǎn)擊"Finish"即可。

六、當(dāng)進(jìn)入到主界面可以看到 IDEA 自動生成相關(guān)的類和文件。
/src/main/java/ 存放項目所有源代碼目錄
/src/main/resources/ 存放項目所有資源文件以及配置文件目錄
/src/test/ 存放測試代碼目錄
pom.xml 配置文件

七、先創(chuàng)建兩個Java bean,一個名稱為Info的實體類,用于接收客戶端傳輸?shù)臄?shù)據(jù),一個名稱為Data的實體類,用于返回數(shù)據(jù)到客戶端。如下圖所示:

Info類完整代碼如下:
package com.example.demo.entity;public class Info {private String nickname;private String gender;private int age;public void setNickname(String nickname) {this.nickname = nickname;}public String getNickname() {return nickname;}public void setGender(String gender) {this.gender = gender;}public String getGender() {return gender;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}}
Data類完整代碼如下:
package com.example.demo.entity;public class Data {private int code;private String result;public Data setCode(int code) {this.code = code;return this;}public int getCode() {return code;}public Data setResult(String result) {this.result = result;return this;}public String getResult() {return result;}}
八、再創(chuàng)建一個名稱為ApiController的類,該類里面分別有g(shù)et,post,dealWith三個方法。get方法用于接收客戶端的GET請求,post方法用于接收客戶端的POST請求,dealWith方法用于處理客戶端傳輸來數(shù)據(jù)并返回處理的結(jié)果。
get方法會自動把客戶端傳來的表單的數(shù)據(jù)解析出來再保存到info變量中,該方法的返回值是一個對象時,會默認(rèn)將對象轉(zhuǎn)換為Json格式返回。post方法的傳入形參和返回的值的流程差不多,不同的是,POST請求時把請求體的數(shù)據(jù)解析出來再保存到info變量中,而且請求體的數(shù)據(jù)格式必須為Json格式。
下面解釋一下ApiController類中的各個注解的作用。
@RestController:處理http請求,返回的數(shù)據(jù)格式為json格式。
@RequestMapping:配置url映射,可以作用于類和方法上??梢允褂胢ethod指定GET,POST,DELETE,PUT四種標(biāo)準(zhǔn)請求,默認(rèn)為GET請求。
@GetMapping:相當(dāng)于@RequestMapping + RequestMethod.GET。用于GET請求。
@PostMapping:相當(dāng)于@RequestMapping + RequestMethod.POST。用于POST請求。
使用這些注解配置Url映射,即可獲得你設(shè)計的API接口:
http:// ip address :8080/api/test

ApiController類的完整的源碼如下:
package com.example.demo.controller;import com.example.demo.entity.Data;import com.example.demo.entity.Info;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*;public class ApiController {public Data get(Info info) {return dealWith(info);}public Data post(Info info) {return dealWith(info);}/*** @param info 用戶的信息* @return 處理用戶信息的結(jié)果*/private Data dealWith(Info info) {String nickname = info.getNickname();String gender = info.getGender();int age = info.getAge();if (StringUtils.isEmpty(nickname)) {return new Data().setCode(-1).setResult("Nickname can not be blank.");}if (StringUtils.isEmpty(gender)) {return new Data().setCode(-2).setResult("Gender can not be blank.");}else if (gender.equals("male")) {gender = "boy";}else if (gender.equals("female")) {gender = "girl";}else {return new Data().setCode(-2).setResult("Gender is not legal");}if (age < 0) {return new Data().setCode(-3).setResult("Age can not be less than zero.");}String result = nickname + "'s age is " + age + " year old, " + "he(she) is a " + gender;return new Data().setCode(0).setResult(result);}}
九、最后進(jìn)行本地測試,點(diǎn)擊啟動按鈕,當(dāng)操控臺輸出“ Completed initialization...... ”的文本,說明該項目啟動成功了,然后打開Microsoft Edge瀏覽器,地址欄中輸入如下url并訪問。
http://localhost:8080/api/test?nickname=Lake&gender=male&age=20進(jìn)行GET請求測試時,當(dāng)請求成功后會看到瀏覽器會顯示一行Json文本,若請求時中填寫的參數(shù)不正確,服務(wù)器返回的Json文本會說明錯誤的原因和對應(yīng)的錯誤碼。


十、簡易的服務(wù)端接口開發(fā)完成了,把這個Spring Boot項目打包成一系列的jar包,然后上傳到一臺已安裝JDK 1.8的服務(wù)器上,打開命令行窗口,輸入命令,"java -jar xxx.jar",該項目即可啟動,若要后臺運(yùn)行,輸入命令"nohup java -jar xxx.jar &",因篇幅有限,關(guān)于打包和部署到服務(wù)器上的操作步驟,暫時不在本文詳寫了。你可能會問服務(wù)器需要安裝Tomcat嗎?答案是:不需要,因為Spring Boot的項目已內(nèi)置Tomcat,所以不必自己再安裝Tomcat了。服務(wù)器開發(fā)流程到此完畢,接下來到客戶端開發(fā)。
客戶端開發(fā)
使用Android Studio開發(fā)Android項目,相信各位朋友都會熟練創(chuàng)建一個空的Android項目了,所以這里不再詳述創(chuàng)建項目的步驟了。Android網(wǎng)絡(luò)請求框架一般有 OkHttp,Retrofit 等,但是本次我使用的是 OkGo 這個網(wǎng)絡(luò)請求框架,這框架我也是第一次用,先試試看。
一、編寫客戶端程序的布局界面,因為界面的布局比較簡單,所以文章中就不貼出布局文件的代碼了,界面布局如下圖所示:

二、在AndroidManifest.xml文件中添加聯(lián)網(wǎng)的權(quán)限,同時在app模塊中的build.gradle文件中添加OkGo的依賴。
AndroidManifest.xml文件中添加聯(lián)網(wǎng)權(quán)限的代碼:
<uses-permission android:name="android.permission.INTERNET"/>在build.gradle文件中添加依賴的代碼:
implementation 'com.lzy.net:okgo:3.0.4'三、在MainActivity類中寫相關(guān)的代碼,initView方法用于初始化布局控件,request方法用于請求服務(wù)端的數(shù)據(jù),RequestMethod接口用于選擇請求的方式(GET/POST),字符串常量URL是服務(wù)端的接口地址。
MainActivity類的完整代碼如下:
package com.example.demo;import android.content.Context;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;import android.widget.RadioButton;import android.widget.TextView;import com.lzy.okgo.OkGo;import com.lzy.okgo.callback.StringCallback;import com.lzy.okgo.model.Response;import java.util.Objects;public class MainActivity extends AppCompatActivity {//服務(wù)器的接口地址private final static String URL = "http://192.168.43.188:8080/api/test";/*** 請求的類型*/private interface RequestMethod {int GET = 1;int POST = 2;}private EditText activity_main_nickname_et;private EditText activity_main_age_et;private RadioButton activity_main_male_rb;private RadioButton activity_main_female_rb;private TextView activity_main_log_tv;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}/*** 初始化布局*/private void initView() {activity_main_nickname_et = findViewById(R.id.activity_main_nickname_et);activity_main_age_et = findViewById(R.id.activity_main_age_et);activity_main_male_rb = findViewById(R.id.activity_main_male_rb);activity_main_female_rb = findViewById(R.id.activity_main_female_rb);activity_main_log_tv = findViewById(R.id.activity_main_log_tv);//軟鍵盤管理final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);final View view = getWindow().peekDecorView();Objects.requireNonNull(imm);findViewById(R.id.activity_main_get_btn).setOnClickListener(new View.OnClickListener() {public void onClick(View v) {imm.hideSoftInputFromWindow(view.getWindowToken(), 0);request(RequestMethod.GET);}});findViewById(R.id.activity_main_post_btn).setOnClickListener(new View.OnClickListener() {public void onClick(View v) {imm.hideSoftInputFromWindow(view.getWindowToken(), 0);request(RequestMethod.POST);}});}/*** 數(shù)據(jù)請求* @param requestType*/private void request(final int requestType) {String nickname = activity_main_nickname_et.getText().toString();String age = activity_main_age_et.getText().toString();String gender = (activity_main_male_rb.isChecked()) ? "male" : "female";if (requestType == RequestMethod.GET) {OkGo.<String>get(URL).params("nickname", nickname).params("gender", gender).params("age", age).execute(new StringCallback() {public void onSuccess(Response<String> response) {String log = "GET請求:\n" + response.body();activity_main_log_tv.setText(log);}});}else if (requestType == RequestMethod.POST) {OkGo.<String>post(URL).params("nickname", nickname).params("gender", gender).params("age", age).execute(new StringCallback() {public void onSuccess(Response<String> response) {String log = "POST請求:\n" + response.body();activity_main_log_tv.setText(log);}});}}}

追加的技巧
快速在一個目錄建立HTTP服務(wù)器
python -m SimpleHTTPServer命令行上漂亮地打印JSON
echo '{"json":"obj"}' | python -mjson.tool而且,如果你安裝了 Pygments 模塊,可以高亮地打印JSON
echo '{"json":"obj"}' | python -mjson.tool | pygmentize -l json注意
{}是一個空的字典,而不是空的集合
「?? 感謝大家」
如果你覺得這篇內(nèi)容對你挺有有幫助的話:
點(diǎn)贊支持下吧,讓更多的人也能看到這篇內(nèi)容(收藏不點(diǎn)贊,都是耍流氓 -_-) 歡迎在留言區(qū)與我分享你的想法,也歡迎你在留言區(qū)記錄你的思考過程。 覺得不錯的話,也可以閱讀近期梳理的文章(感謝鼓勵與支持??????): 編程中的惰性思想 小程序云開發(fā)資源的管理 教你用python進(jìn)行數(shù)字化妝,可愛至極 加速Python列表和字典,讓你代碼更加高效 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(三) 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(二) 匯總超全的Matplotlib可視化最有價值的 50 個圖表(附完整 Python 源代碼)(一) 教你用Python制作實現(xiàn)自定義字符大小的簡易小說閱讀器 「查缺補(bǔ)漏」鞏固你對算法復(fù)雜度的理解 匯總了32個為開發(fā)者提供的免費(fèi)工具 教你通過python利用近鄰法實現(xiàn)圖片縮小后變成另一張圖(類似幻影坦克) 30 行代碼實現(xiàn)螞蟻森林自動收能量
老鐵,三連支持一下,好嗎?↓↓↓


點(diǎn)分享

點(diǎn)點(diǎn)贊

點(diǎn)在看

