HarmonyOS 鸿蒙Next https请求问题和base64加密问题

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next https请求问题和base64加密问题

问题【可以确定接口是没有问题的,给的请求参数,url,header都没有任何问题】
1. 网络请求返回报错"OAuth 2.0 Parameter: grant_type" 但是这个是有在extraData设置了的
2. 字符串转base64字符串的系统调用怎么弄,研究了很久都没找到合适的资料
a. 用ArkTS的import buffer from '[@ohos](/user/ohos).buffer',用不了
b. 用typeScript的btoa,在工程里面提示找不到方法,所以临时自己弄了一个base64的方法实现

```typescript
function stringToBase64(str: string): string {
  return btoa(str);
}

// 使用示例
const myString = "Hello, World!";
const base64String = stringToBase64(myString);
console.log(base64String);
// 当使用POST请求时此字段用于传递内容
let extraData = {
  'username': 'admin',
  'password': '123456',
  'grant_type': 'password',
  'scope': 'server'
}
httpRequestPost('https://gateway.metadigital.net.cn/auth/oauth2/token', extraData)
// 请求类实现
import http from '[@ohos](/user/ohos).net.http'
import { getBase64String } from '../pages/CommonFunc'

export const BASE_URL : string = '';

export function httpRequestPost(url:string,params:any) {
  url = BASE_URL + url
  let httpRequest = http.createHttp()
  var header = {
    'Content-Type' : 'application/json',
    'Tenant-id': '1',
    'Authorization': 'Basic ' + getBase64String("mini:" + "mini"),
    'lang': 'zh_CN'
  }
  let responseResult = httpRequest.request(url,{
    method:http.RequestMethod.POST,
    extraData:params,
    header:header
  })
  let serverData ={
    code,
    data:'',
    msg:''
  } = {code:0,data:'',msg:''}
  return responseResult.then((value)=>{
    console.info('返回:'+JSON.stringify(header))
    console.info('返回:'+JSON.stringify(value))
    if (value.responseCode === 200) {
      let result = `${value.result}`
      let resultJson = JSON.parse(result)
      console.log(resultJson)
      serverData.data = resultJson.data
      serverData.code = resultJson.code
      serverData.msg = resultJson.msg
    } else {
      serverData.code = value.responseCode
    }
    return serverData
  }).catch((e) => {
    console.log(e)
    serverData.msg = '接口调用失败'
    return serverData
  })
}

自定义base64加密

import * as Buffer from '[@ohos](/user/ohos).buffer';

function base64Encode(str) {
  const base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  let result = "";
  let i = 0;

  while (i < str.length) {
    let char1 = str.charCodeAt(i++);
    let char2 = str.charCodeAt(i++);
    let char3 = str.charCodeAt(i++);

    let enc1 = char1 >> 2;
    let enc2 = ((char1 & 3) << 4) | (char2 >> 4);
    let enc3 = ((char2 & 15) << 2) | (char3 >> 6);
    let enc4 = char3 & 63;

    if (isNaN(char2)) {
      enc3 = enc4 = 64;
    } else if (isNaN(char3)) {
      enc4 = 64;
    }

    result += 
    base64Table.charAt(enc1) +
    base64Table.charAt(enc2) +
    base64Table.charAt(enc3) +
    base64Table.charAt(enc4);
  }

  return result;
}

export function getBase64String(str) {
  let originalString = str ? str : "mini:mini";
  let base64String = base64Encode(originalString);
  console.log("Base64 编码后的字符串:" + base64String);
  return base64String;
}

请求返回

03-19 20:32:46.978 21841-10012 0FEFE/JsApp com.example.myapplication I Base64 编码后的字符串:bWluaTptaW5p

03-19 20:32:47.520 21841-10012 0FEFE/JsApp com.example.myapplication I 返回:{“Content-Type”:“application/json”,“Tenant-id”:“1”,“Authorization”:“Basic bWluaTptaW5p”,“lang”:“zh_CN”}

03-19 20:32:47.520 21841-10012 0FEFE/JsApp com.example.myapplication I 返回:{“responseCode”:400,“cookies”:"",“header”:{“cache-control”:“no-cache, no-store, max-age=0, must-revalidate”,“connection”:“keep-alive”,“content-type”:“application/json; charset=UTF-8”,“date”:“Thu, 21 Mar 2024 01:48:16 GMT”,“expires”:“0”,“pragma”:“no-cache”,“server”:“nginx”,“transfer-encoding”:“chunked”,“x-content-type-options”:“nosniff”,“x-frame-options”:“DENY”,“x-xss-protection”:“1; mode=block”},“result”:"{“code”:1,“msg”:“OAuth 2.0 Parameter: grant_type”,“data”:null}",“resultType”:0}


更多关于HarmonyOS 鸿蒙Next https请求问题和base64加密问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

extraData不是这么传的,它是key和value拼接起来的字符串,形如:key1=value1&key2=value2

下面是使用系统提供的api进行base64编码的方法:

static encode(text: string): string {
    let textEncoder = new util.TextEncoder();
    let array = textEncoder.encodeInto(text)
    let helper = new util.Base64Helper();
    return helper.encodeToStringSync(array);
}

static decode(data: string | Uint8Array): string {
    let helper = new util.Base64Helper();
    let result = helper.decodeSync(data)
    let decoder = util.TextDecoder.create('utf-8')
    return decoder.decodeWithStream(result)
}

更多关于HarmonyOS 鸿蒙Next https请求问题和base64加密问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,是改成这样吗
我的代码是参考官方文档上写的,一直没有请求成功

按照你的方式改也是一样,可能是哪里改错了

let params = 'username=admin&password=123456&grant_type=password&scope=server'  
httpRequestPost('/auth/oauth2/token?', params)  
不好意思,没太仔细看,原因是header里面的Content-Type的问题,修改为:`application/x-www-form-urlencoded` 就能正常请求了,

针对帖子标题“HarmonyOS 鸿蒙Next https请求问题和base64加密问题”,以下是对这两个问题的专业回答:

Https请求问题:

在HarmonyOS鸿蒙系统中进行HTTPS请求时,你需要确保网络请求库(如OkHttp、Retrofit等,若使用Java系库则不适用此回答,考虑到限制)已正确集成并配置。此外,需验证SSL/TLS证书的有效性,以及服务器地址和端口的正确性。若遇到请求失败,检查是否因网络权限、防火墙或代理设置导致。确保应用已申请必要的网络权限,并正确处理网络异常。

Base64加密问题:

HarmonyOS提供了Base64编码和解码的功能。在编码时,使用Base64.encodeToString方法;解码时,使用Base64.decode方法。确保输入的字符串是有效的Base64编码,且在编码和解码过程中字符集保持一致。若解码后数据不正确,检查输入字符串是否包含非法字符或格式错误。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部