1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 10317字,需瀏覽 21分鐘

         ·

        2021-07-07 09:39

        前言

        為了解決服務(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.*;
        @RestController@RequestMapping(value = "/api")public class ApiController {
        @GetMapping(value = "/test") public Data get(Info info) { return dealWith(info); }
        @PostMapping(value = "/test") 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;
        @Override 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() { @Override public void onClick(View v) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); request(RequestMethod.GET); } });
        findViewById(R.id.activity_main_post_btn) .setOnClickListener(new View.OnClickListener() { @Override 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() { @Override 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() { @Override public void onSuccess(Response<String> response) { String log = "POST請求:\n" + response.body(); activity_main_log_tv.setText(log); } }); } }}


        四、客戶端的代碼大概就是這樣,現(xiàn)在來測試一下客戶端與服務(wù)端的交互。本地測試,先保證電腦和手機(jī)連接了同一個網(wǎng)絡(luò)并且電腦需要打開8080端口,例如連接同一個WiFi,或者手機(jī)開熱點(diǎn),電腦連接手機(jī)的熱點(diǎn)。 然后獲取電腦的IP地址,再把客戶端的代碼中MainActivity類的URL常量的IP地址改為你電腦(服務(wù)器)的IP地址。把IDEA中的服務(wù)端程序啟動,再把客戶端Demo安裝到手機(jī)上,就可以體驗到自己親手設(shè)計的接口了。效果圖如下:




        追加的技巧

        • 快速在一個目錄建立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)容對你挺有有幫助的話:

        1. 點(diǎn)贊支持下吧,讓更多的人也能看到這篇內(nèi)容(收藏不點(diǎn)贊,都是耍流氓 -_-)
        2. 歡迎在留言區(qū)與我分享你的想法,也歡迎你在留言區(qū)記錄你的思考過程。
        3. 覺得不錯的話,也可以閱讀近期梳理的文章(感謝鼓勵與支持??????):


        老鐵,三連支持一下,好嗎?↓↓↓




        歡迎大家加入到知識星球這個大家庭,這里一定有與你志同道合的小伙伴,在這里大家可以一起交流,一起學(xué)習(xí),一同吹逼,一同玩耍。。。


        長按按鈕  “識別二維碼” 關(guān)注我
        更多精彩內(nèi)容等著你哦

        點(diǎn)分享

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

        點(diǎn)在看

        瀏覽 59
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产大午午夜一级毛片 | 97操B| 天天色偷偷 | 色视频在线 | 欧美黄片在线免费观看 | 四川妇女BBBW和BBBWm | 日韩激情合集 | 黄色短视频在线观看 网站 | 苍井空无码一区二区三区 | 女人男人交性爽视频 |