一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-22 17:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

流程圖:

image.png

一、簡(jiǎn)單的交互

前端請(qǐng)求函數(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
      }
   })
}

這兩個(gè)函數(shù)是使用axios庫(kù)發(fā)起HTTP GET請(qǐng)求的函數(shù),用于與服務(wù)器進(jìn)行通信

  • 服務(wù)器端點(diǎn): http://192.168.211.1:8090/test/1 這是我本機(jī)的ip地址和springboot運(yùn)行端口,使用在windows終端輸入ipconfig可查看
  • 返回值: 該函數(shù)返回一個(gè)Promise,該P(yáng)romise在請(qǐng)求成功時(shí)將包含AxiosResponse對(duì)象,其中包含了從服務(wù)器接收到的響應(yīng)信息。

后端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請(qǐng)求從后端獲取的數(shù)據(jù)";
    }   
    @GetMapping("/2")
    public int AB(@RequestParam int a, @RequestParam int b){
        return a + b;
    }
}

test1()方法:

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

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

一、前后端交互配置

  • Arkts目錄結(jié)構(gòu)

image.png

前端axios封裝一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求 在src/main/ets/network/AxiosRequest.ets里

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

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

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

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

axios請(qǐng)求

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

后端controller

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

2.get請(qǐng)求傳遞多個(gè)參數(shù)

axios請(qǐng)求

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 "你傳的兩個(gè)數(shù)是" + a + " " + b;
 }

@RequestParam 注解允許你自定義請(qǐng)求參數(shù)的名稱(chēng),并提供其他選項(xiàng),如設(shè)置默認(rèn)值或?qū)?shù)標(biāo)記為必需

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

axios請(qǐng)求

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

后端controller

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

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

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

axios請(qǐng)求

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

Promise> 表示一個(gè) Promise 對(duì)象,該對(duì)象最終解決為 Axios 發(fā)起的 HTTP 請(qǐng)求的響應(yīng),而該響應(yīng)的數(shù)據(jù)體應(yīng)該符合 ResponseData 類(lèi)型的結(jié)構(gòu)。

后端controller

//@Data注解一個(gè)類(lèi)時(shí),Lombok會(huì)自動(dòng)為該類(lèi)生成常見(jiàn)的方法,如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 使用對(duì)象作為請(qǐng)求參數(shù)

axios請(qǐng)求

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接收J(rèn)SON數(shù)據(jù)

axios請(qǐng)求

//JSON中,鍵和字符串值都應(yīng)該被雙引號(hào)包圍如
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 "你傳的鍵值對(duì)是: " + data;
}

7.put請(qǐng)求

axios請(qǐng)求

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請(qǐng)求,傳入的數(shù)據(jù)是: " + data;
}

8.delete請(qǐng)求

axios請(qǐng)求

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請(qǐng)求,要?jiǎng)h除的數(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請(qǐng)求獲取數(shù)據(jù)")
        .onClick(async () = >{
          this.get1 = (await get1()).data;
        })
      Text(this.get1)
        .fontSize(20)
      Button("get2-傳遞多個(gè)參數(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-使用對(duì)象作為請(qǐng)求參數(shù)")
        .onClick(async () = >{
          this.post1 = (await post1({name: "張三", age: 18})).data;
        })
      Text(this.post1)
        .fontSize(20)

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

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

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

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

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

四、總結(jié)

一、請(qǐng)求參數(shù)錯(cuò)誤的常見(jiàn)情況:

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

二、不同請(qǐng)求方式與參數(shù)傳遞方式的對(duì)應(yīng)關(guān)系:

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

審核編輯 黃宇

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

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125631
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2621

    瀏覽量

    44074
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18645
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何實(shí)現(xiàn)組件截圖 -- componentSnapshot

    等,文字和圖片都是根據(jù)用戶信息動(dòng)態(tài)生成的,整個(gè)證書(shū)在顯示的時(shí)候是通過(guò)Stack組件去完成的,如果只是在程序里顯示那么當(dāng)然很簡(jiǎn)單,但是還需要將其作為一張圖片保存到相冊(cè)里。 按照我以前的做法,就是直接通過(guò)后端
    發(fā)表于 06-30 17:45

    k8s網(wǎng)絡(luò)的基本介紹

    Kubernetes網(wǎng)絡(luò)是指在Kubernetes集群中不同組件之間進(jìn)行通信和交互網(wǎng)絡(luò)架構(gòu)。
    的頭像 發(fā)表于 06-16 13:42 ?260次閱讀

    DialogHub上線OpenHarmony開(kāi)源社區(qū),高效開(kāi)發(fā)鴻蒙應(yīng)用彈窗

    作為鴻蒙應(yīng)用開(kāi)發(fā)者,在使用ArkUI現(xiàn)有能力進(jìn)行彈窗開(kāi)發(fā)時(shí),總會(huì)遇到一些讓人糾結(jié)的交互問(wèn)題:應(yīng)用內(nèi)進(jìn)行消息提示時(shí),既要求消息內(nèi)容支持圖文混排,又要求彈窗本身不能打斷用戶交互(頁(yè)面滑動(dòng)、
    發(fā)表于 04-03 17:30

    ADS9254變壓器后端匹配網(wǎng)絡(luò)怎么設(shè)計(jì)比較好?

    請(qǐng)問(wèn)目前我用ADS9254的芯片 模擬端怎么處理比較好,我看開(kāi)發(fā)板使用的是一對(duì)變壓器實(shí)現(xiàn)的,目前實(shí)際應(yīng)用中單端模擬信號(hào)中頻為45M,是否一個(gè)變壓器就可以,另外變壓器后端匹配網(wǎng)絡(luò)怎么設(shè)計(jì)比較好?有沒(méi)有可供參考的電路?謝謝!
    發(fā)表于 01-22 06:02

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

    系統(tǒng)的可擴(kuò)展性和靈活性。 前后端分離:前端使用Vue或UniApp進(jìn)行開(kāi)發(fā),后端基于Spring Boot,確??焖夙憫?yīng)和良好的用戶體驗(yàn)。
    的頭像 發(fā)表于 01-09 17:39 ?730次閱讀

    校園點(diǎn)餐訂餐外賣(mài)跑腿Java源碼

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

    SSM開(kāi)發(fā)環(huán)境的搭建教程 SSM與Spring Boot的區(qū)別

    SSM開(kāi)發(fā)環(huán)境的搭建教程 SSM(Spring+SpringMVC+MyBatis)開(kāi)發(fā)環(huán)境的搭建涉及多個(gè)步驟,以下是詳細(xì)的教程: 創(chuàng)建Maven項(xiàng)目 : 使用Maven工具創(chuàng)建一個(gè)新的Maven
    的頭像 發(fā)表于 12-16 18:13 ?1396次閱讀

    SSM框架在Java開(kāi)發(fā)中的應(yīng)用 如何使用SSM進(jìn)行web開(kāi)發(fā)

    。以下是對(duì)SSM框架在Java開(kāi)發(fā)中的應(yīng)用,以及如何使用SSM進(jìn)行web開(kāi)發(fā)的介紹: SSM框架的組件及其作用 SpringSpring是一個(gè)開(kāi)源的Java/Java EE全功能棧
    的頭像 發(fā)表于 12-16 17:28 ?1597次閱讀

    Spring 應(yīng)用合并之路(二):峰回路轉(zhuǎn),柳暗花明

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

    eBPF技術(shù)實(shí)踐之virtio-net網(wǎng)卡隊(duì)列可觀測(cè)

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

    Spring事務(wù)實(shí)現(xiàn)原理

    作者:京東零售 范錫軍 1、引言 springspring-tx模塊提供了對(duì)事務(wù)管理支持,使用spring事務(wù)可以讓我們從復(fù)雜的事務(wù)處理中得到解脫,無(wú)需要去處理獲得連接、關(guān)閉連接、事務(wù)提交和回滾等
    的頭像 發(fā)表于 11-08 10:10 ?1158次閱讀
    <b class='flag-5'>Spring</b>事務(wù)實(shí)現(xiàn)原理

    AD620對(duì)光電二極管的信號(hào)來(lái)進(jìn)行前置放大作用,如何對(duì)輸入端進(jìn)行處理?

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

    基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):簡(jiǎn)易計(jì)數(shù)器

    1、程序簡(jiǎn)介 該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫(xiě)的UI應(yīng)用類(lèi):Sample Counter(簡(jiǎn)單計(jì)數(shù)器)。 該程序設(shè)計(jì)1個(gè)按鈕和顯示框。當(dāng)每次按下按鈕,則顯示框數(shù)字累加1。 本案
    發(fā)表于 09-14 13:38

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

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

    單片機(jī)boot0和boot1怎么設(shè)置

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