0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony:使用網(wǎng)絡組件axios與Spring Boot進行前后端交互

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-22 17:35 ? 次閱讀

流程圖:

image.png

一、簡單的交互

前端請求函數(shù)

firstGet(): Promise< AxiosResponse >{
    return axios.get('http://192.168.211.1:8090/test/1');
}
getAaddB(a: number, b: number): Promise< AxiosResponse >{
   return axios.get('http://192.168.211.1:8090/test/2', {
      params: {
        a: a,
        b: b
      }
   })
}

這兩個函數(shù)是使用axios庫發(fā)起HTTP GET請求的函數(shù),用于與服務器進行通信

  • 服務器端點: http://192.168.211.1:8090/test/1 這是我本機的ip地址和springboot運行端口,使用在windows終端輸入ipconfig可查看
  • 返回值: 該函數(shù)返回一個Promise,該Promise在請求成功時將包含AxiosResponse對象,其中包含了從服務器接收到的響應信息

后端controller

package com.example.demospring.controller;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/test")
@RestController
public class test1 {
    @GetMapping("/1")
    public String test11(){
        return "這是axios發(fā)送get請求從后端獲取的數(shù)據(jù)";
    }   
    @GetMapping("/2")
    public int AB(@RequestParam int a, @RequestParam int b){
        return a + b;
    }
}

test1()方法:

  • 功能: 當接收到GET請求 /test/1 時,該方法返回一個字符串 “這是axios發(fā)送get請求從后端獲取的數(shù)據(jù)”。
  • 備注: 這是一個簡單的用于演示GET請求的方法,返回字符串數(shù)據(jù)。

二、axios與Spring Boot進行前后端交互的實現(xiàn)

一、前后端交互配置

  • Arkts目錄結構

image.png

前端axios封裝一個簡單的網(wǎng)絡請求 在src/main/ets/network/AxiosRequest.ets里

import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios' // 公共請求前綴 axios.defaults.baseURL = "http://192.168.211.1:8090" // 添加請求攔截器... // 添加響應攔截器... // 導出 export default axios; export {AxiosResponse}

  • 后端用于配置跨域資源共享(CORS)的設置 登錄后復制 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 映射的路徑,這里是所有路徑 .allowedOrigins(" ") // 允許的來源,這里是所有來源,可以設置具體的域名或 IP 地址 .allowedMethods("PUT", "GET", "POST", "DELETE") // 允許的 HTTP 方法 .allowedHeaders(" ") // 允許的 HTTP 頭部 .allowCredentials(false) // 是否支持用戶憑據(jù),這里是不支持 .maxAge(300); // 預檢請求的有效期,單位秒 } @RequestMapping("/hello"):這個注解用于類級別,表示所有在這個控制器中的方法的URL映射的基本路徑 登錄后復制 @RestController @RequestMapping("/hello") public class SumUpController { ... }

二、不同請求的參數(shù)傳遞與后端接收返回代碼

1.get請求獲取數(shù)據(jù)

axios請求

export function get1(): Promise< AxiosResponse > {
  return axios.get('/hello/get1');
}

后端controller

@GetMapping("/get1")
public String get1(){
    return "這是你拿到的數(shù)據(jù)";
}

2.get請求傳遞多個參數(shù)

axios請求

export function get2(a: number, b: number): Promise< AxiosResponse > {
  return axios.get('/hello/get2', {
    //params字段包含了將要發(fā)送到后端的參數(shù)。
    params: {
      a: a,
      b: b
    }
  });
}

后端controller

@GetMapping("/get2")
 //使用@RequestParam注解從URL中獲取參數(shù)a和b。
 public String get2(@RequestParam int a, @RequestParam int b){
    return "你傳的兩個數(shù)是" + a + " " + b;
 }

@RequestParam 注解允許你自定義請求參數(shù)的名稱,并提供其他選項,如設置默認值或?qū)?shù)標記為必需

3.get請求路徑參數(shù)

axios請求

export function get3(ps: number, pn: number): Promise< AxiosResponse > {
  //注意要用``(反引號)
  return axios.get(`/hello/get3/${pn}/${ps}`);
}

后端controller

@GetMapping("/get3/{pn}/{ps}")
public String get3(@PathVariable("ps") int ps, @PathVariable("pn") int pn){
    return "你的查找要求是一頁" + ps + "條數(shù)據(jù)的第" +  pn + "頁";
}

@PathVariable("id") 表示要從路徑中提取一個名為 “id” 的變量,并將其值綁定到 itemId 參數(shù)上。

4.get請求返回JSON數(shù)據(jù)

axios請求

//定義請求接收的數(shù)據(jù)類型
export interface ResponseData {
  status: string;
  message: string;
}
export function get4(): Promise< AxiosResponse< ResponseData > > {
  return axios.get('/hello/get4');
}

Promise> 表示一個 Promise 對象,該對象最終解決為 Axios 發(fā)起的 HTTP 請求的響應,而該響應的數(shù)據(jù)體應該符合 ResponseData 類型的結構。

后端controller

//@Data注解一個類時,Lombok會自動為該類生成常見的方法,如toString()、equals(),以及所有字段的getter和setter方法。
@Data
public static class ResponseData {
    private String status;
    private String message;
}
@GetMapping("/get4")
public ResponseData get4() {
    ResponseData responseData = new ResponseData();
    responseData.setStatus("success");
    responseData.setMessage("這是一條成功的消息。");
    return responseData;
}

5.post 使用對象作為請求參數(shù)

axios請求

export function post1(person: { name: string, age: number }): Promise< AxiosResponse > {
  return axios.post(`/hello/post1`, person);
}

后端controller

@Data
public static class Person {
    private String name;
    private int age;
}
@PostMapping("/post1")
public String post1(@RequestBody Person person) {
    return "你傳的姓名: " + person.getName() + " 年齡: " + person.getAge() + "。";
}

6.post 使用Map接收JSON數(shù)據(jù)

axios請求

//JSON中,鍵和字符串值都應該被雙引號包圍如
export function post2(data: any): Promise< AxiosResponse > {
  return axios.post(`/hello/post2`, data);
}

后端controller

@PostMapping("/post2")
public String post2(@RequestBody Map< String, String > mp) {
    AtomicReference< String > data = new AtomicReference<  >("");
    mp.forEach((k, v) - >{
        data.set(data + k);
        data.set(data + ": ");
        data.set(data + v + ",");
    });
    return "你傳的鍵值對是: " + data;
}

7.put請求

axios請求

export function putExample(data: string): Promise< AxiosResponse > {
  return axios.put('/hello/putExample', {data: data});
}

后端controller

@PutMapping("/putExample")
public String putExample(@RequestBody String data) {
    return "這是PUT請求,傳入的數(shù)據(jù)是: " + data;
}

8.delete請求

axios請求

export function deleteExample(id: number): Promise< AxiosResponse > {
  return axios.delete(`/hello/deleteExample/${id}`);
}

后端controller

@DeleteMapping("/deleteExample/{id}")
public String deleteExample(@PathVariable("id") int id) {
    return "這是DELETE請求,要刪除的數(shù)據(jù)ID是: " + id;
}

三、調(diào)用傳參

import router from '@ohos.router'
import {get1, get2, get3, get4, post1, post2, putExample, deleteExample} from '../network/api/TestApi'
@Entry
@Component
struct Index {
  @State get1: string = "";
  @State get2: number = undefined;
  @State get3: number = undefined;
  @State get4: {status: string, message: string} = null;
  @State post1: string = "";
  @State post2: string = "";
  @State put: string = "";
  @State delete: string = "";
  build() {
    Column() {
      Button("get1-get請求獲取數(shù)據(jù)")
        .onClick(async () = >{
          this.get1 = (await get1()).data;
        })
      Text(this.get1)
        .fontSize(20)
      Button("get2-傳遞多個參數(shù)")
        .onClick(async () = >{
          this.get2 = (await get2(1, 3)).data;
        })
      Text(`${this.get2!=undefined?this.get2:""}`)
        .fontSize(20)
      Button("get3-路徑參數(shù)")
        .onClick(async () = >{
          this.get3 = (await get3(3, 4)).data;
        })
      Text(`${this.get3!=undefined?this.get3:""}`)
        .fontSize(20)
      Button("get4-返回JSON數(shù)據(jù)")
        .onClick(async () = >{
          this.get4 = (await get4()).data;
        })
      Text(this.get4!=null ? JSON.stringify(this.get4) : "")
        .fontSize(20)

      Button("post1-使用對象作為請求參數(shù)")
        .onClick(async () = >{
          this.post1 = (await post1({name: "張三", age: 18})).data;
        })
      Text(this.post1)
        .fontSize(20)

      Button("post2-使用Map接收JSON數(shù)據(jù)的POST請求示例")
        .onClick(async () = >{
          this.post2 = (await post2({id: "1", name: "李四", status: "call"})).data;
        })
      Text(this.post2)
        .fontSize(20)

      Button("put請求")
        .onClick(async () = >{
          this.put = (await putExample("put data")).data;
        })
      Text(this.put)
        .fontSize(20)

      Button("delete請求")
        .onClick(async () = >{
          this.delete = (await deleteExample(10)).data;
        })
      Text(this.delete)
        .fontSize(20)
      Button("對一個表單的增刪改查")
        .margin(20)
        .onClick(() = >{
          router.pushUrl({
            url: "pages/TalentTableTest"
          })
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

以上就是鴻蒙開發(fā)的OpenHarmony;使用網(wǎng)絡組件axios與Spring Boot進行前后端交互的技術解析,更多有關鴻蒙開發(fā)的學習,可以去主頁查找,找我保存技術文檔。下面分享一張OpenHarmony學習路線圖

高清完整版曲線圖,可以找我保存 (附鴻蒙4.0&next版文檔)如下:

四、總結

一、請求參數(shù)錯誤的常見情況:

  1. 參數(shù)名稱不一致
  2. 參數(shù)類型(格式)不一致
  3. 缺少必須的請求參數(shù)
  4. 請求頭信息不符合要求

二、不同請求方式與參數(shù)傳遞方式的對應關系:

  1. RESTful風格的API通常使用路徑變量傳遞參數(shù)。在Spring框架中,可以使用@PathVariable注解來接收這些參數(shù)。
  2. URL中使用params傳遞參數(shù)時,通常使用@RequestParam注解來接收參數(shù)。
  3. 當客戶端通過請求體傳遞JSON數(shù)據(jù)時,可以使用@RequestBody注解來接收。
  4. @ModelAttribute用于綁定方法參數(shù)或方法返回值到模型中,通常用于將請求參數(shù)與模型屬性進行綁定。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)

    關注

    37

    文章

    6859

    瀏覽量

    123501
  • 鴻蒙
    +關注

    關注

    57

    文章

    2378

    瀏覽量

    42938
  • OpenHarmony
    +關注

    關注

    25

    文章

    3731

    瀏覽量

    16431
收藏 人收藏

    評論

    相關推薦

    如何使用Java語言快速開發(fā)一套智慧工地系統(tǒng)(源碼)

    系統(tǒng)的可擴展性和靈活性。 前后端分離:前端使用Vue或UniApp進行開發(fā),后端基于Spring Boot,確保快速響應和良好的用戶體驗。
    的頭像 發(fā)表于 01-09 17:39 ?132次閱讀

    校園點餐訂餐外賣跑腿Java源碼

    創(chuàng)建一個校園點餐訂餐外賣跑腿系統(tǒng)是一個復雜的項目,涉及到前端、后端、數(shù)據(jù)庫設計等多個方面。在這里,我可以提供一個簡化的Java后端示例,使用Spring Boot框架來搭建一個基本的A
    的頭像 發(fā)表于 12-24 14:55 ?151次閱讀
    校園點餐訂餐外賣跑腿Java源碼

    Spring 應用合并之路(二):峰回路轉,柳暗花明

    提醒下,決定拋開 Spring Boot 內(nèi)置的父子容器方案,完全自己實現(xiàn)父子容器。 如何加載 web 項目? 現(xiàn)在的難題只有一個:如何加載 web 項目?加載完成后,如何持續(xù)持有 web 項目?經(jīng)過思考后,可以創(chuàng)建一個 boot
    的頭像 發(fā)表于 12-12 11:22 ?779次閱讀

    eBPF技術實踐之virtio-net網(wǎng)卡隊列可觀測

    時,這一路徑難以進行觀測。一些復雜的網(wǎng)絡抖動問題很可能是由于網(wǎng)卡隊列不正常工作引起的。為了解決這類問題,我們基于eBPF技術擴展了網(wǎng)卡隊列的可觀測能力,使得virtio網(wǎng)卡前后端的定界問題不再困擾。 virtio-net
    的頭像 發(fā)表于 11-14 11:18 ?242次閱讀
    eBPF技術實踐之virtio-net網(wǎng)卡隊列可觀測

    AD620對光電二極管的信號來進行前置放大作用,如何對輸入端進行處理?

    我們使用的是AD620對光電二極管的信號來進行前置放大作用,但是不知道如何對輸入端進行處理。
    發(fā)表于 09-18 07:32

    Spring Cloud Gateway網(wǎng)關框架

    SpringCloud Gateway功能特征如下: (1) 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進行構建
    的頭像 發(fā)表于 08-22 09:58 ?520次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關框架

    單片機boot0和boot1怎么設置

    單片機Boot0和Boot1簡介 Boot0和Boot1是單片機啟動模式選擇引腳,用于選擇單片機的啟動模式。 Boot0和
    的頭像 發(fā)表于 08-22 09:50 ?2873次閱讀

    vue+spring boot人員定位系統(tǒng)源碼,實現(xiàn)實時定位、智慧調(diào)度、軌跡追蹤

    、機具、物料上定位標簽回傳的位置信息數(shù)據(jù),采用多維定位模式,精確定位人、機具、物料的實時位置,實現(xiàn)實時定位、物料標簽配置、智慧調(diào)度、軌跡追蹤、工時統(tǒng)計、區(qū)域物料統(tǒng)計、電子圍欄等應用功能。 技術架構:java+ spring boot+ v
    的頭像 發(fā)表于 08-08 14:27 ?809次閱讀
    vue+<b class='flag-5'>spring</b> <b class='flag-5'>boot</b>人員定位系統(tǒng)源碼,實現(xiàn)實時定位、智慧調(diào)度、軌跡追蹤

    前后端數(shù)據(jù)傳輸約定探討

    1 目的 穩(wěn)定可靠,降本增效 ? 前后端數(shù)據(jù)傳輸約定旨在提升系統(tǒng)穩(wěn)定性、可靠性,降低線上線下bug率;并提升研發(fā)效率、降低溝通成本、降低延期率。是確保項目前端和后端開發(fā)順利進行的重要規(guī)約之一,定義了
    的頭像 發(fā)表于 07-08 19:10 ?258次閱讀
    <b class='flag-5'>前后端</b>數(shù)據(jù)傳輸約定探討

    UWB室內(nèi)外高精度一體化融合定位系統(tǒng)源碼 UWB技術定位系統(tǒng)應用場景 Java+Spring boot+MYSQL?技術開發(fā)

    UWB室內(nèi)外高精度一體化融合定位系統(tǒng)源碼 UWB技術定位系統(tǒng)應用場景 Java+Spring boot+MYSQL?技術開發(fā) 系統(tǒng)聚焦基于UWB(超寬帶)技術的底層定位網(wǎng)絡和定位算法,通過對定位分站
    的頭像 發(fā)表于 06-18 10:46 ?504次閱讀
    UWB室內(nèi)外高精度一體化融合定位系統(tǒng)源碼 UWB技術定位系統(tǒng)應用場景 Java+<b class='flag-5'>Spring</b> <b class='flag-5'>boot</b>+MYSQL?技術開發(fā)

    OpenHarmony實戰(zhàn)開發(fā)-如何實現(xiàn)組件動畫。

    ArkUI為組件提供了通用的屬性動畫和轉場動畫能力的同時,還為一些組件提供了默認的動畫效果。例如,List的滑動動效,Button的點擊動效,是組件自帶的默認動畫效果。在組件默認動畫效
    的頭像 發(fā)表于 04-28 15:49 ?652次閱讀
    <b class='flag-5'>OpenHarmony</b>實戰(zhàn)開發(fā)-如何實現(xiàn)<b class='flag-5'>組件</b>動畫。

    鴻蒙OpenHarmony【快速入門概述】

    OpenHarmony是一款面向全場景的開源分布式操作系統(tǒng),采用組件化設計,支持在128KiB到xGiB RAM資源的設備上運行系統(tǒng)組件,設備開發(fā)者可基于目標硬件能力自由選擇系統(tǒng)組件
    的頭像 發(fā)表于 04-19 15:14 ?494次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【快速入門概述】

    鴻蒙OS封裝【axios 網(wǎng)絡請求】(類似Android的Okhttp3)

    HarmonyOS 封裝 axios 網(wǎng)絡請求 包含 token 類似Android Okhttp3
    的頭像 發(fā)表于 03-26 21:14 ?2782次閱讀

    鴻蒙開發(fā)實戰(zhàn):網(wǎng)絡請求庫【axios

    [Axios]?,是一個基于 promise 的網(wǎng)絡請求庫,可以運行 node.js 和瀏覽器中。本庫基于[Axios]原庫v1.3.4版本進行適配,使其可以運行在
    的頭像 發(fā)表于 03-25 16:47 ?3966次閱讀
    鴻蒙開發(fā)實戰(zhàn):<b class='flag-5'>網(wǎng)絡</b>請求庫【<b class='flag-5'>axios</b>】

    模擬后端是什么意思

    模擬后端,在軟件開發(fā)和測試領域,通常是指使用工具或技術來模擬實際后端服務的行為。這樣做的主要目的是在項目開發(fā)過程中,當后端服務還未就緒或暫時無法訪問時,前端或其他依賴后端的系統(tǒng)能夠繼續(xù)
    的頭像 發(fā)表于 03-15 15:58 ?703次閱讀