You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中发起带HTTP Basic Auth的POST请求及调用TinyPNG API压缩图片

嘿,我来帮你搞定这两个React相关的请求问题,一步步拆解给你看!

1. React中发起带HTTP Basic Auth的POST请求

HTTP Basic Auth的核心逻辑是:把用户名和密码用冒号拼接,再做Base64编码,然后放到请求头的Authorization字段里,格式是Basic <编码后的字符串>。下面给你两种常用实现方式:

方式一:使用原生Fetch API

// 假设你的认证信息和请求数据
const authUsername = "你的用户名";
const authPassword = "你的密码";
const postData = { key: "value" };

// 生成认证字符串
const authString = btoa(`${authUsername}:${authPassword}`);

// 发起POST请求
const sendPostRequest = async () => {
  try {
    const response = await fetch("你的请求URL", {
      method: "POST",
      headers: {
        "Authorization": `Basic ${authString}`,
        "Content-Type": "application/json" // 根据接口要求调整Content-Type
      },
      body: JSON.stringify(postData)
    });

    if (!response.ok) {
      throw new Error(`请求失败: ${response.status}`);
    }

    const result = await response.json();
    console.log("请求成功结果:", result);
  } catch (error) {
    console.error("请求出错:", error);
  }
};

// 调用函数
sendPostRequest();

方式二:使用Axios(更简洁)

Axios自带了auth参数,不需要手动编码,直接传入用户名和密码即可:

import axios from "axios";

const sendPostRequestWithAxios = async () => {
  try {
    const response = await axios.post("你的请求URL", { key: "value" }, {
      auth: {
        username: "你的用户名",
        password: "你的密码"
      },
      headers: {
        "Content-Type": "application/json"
      }
    });

    console.log("请求成功结果:", response.data);
  } catch (error) {
    console.error("请求出错:", error);
  }
};

sendPostRequestWithAxios();
2. 用TinyPNG API压缩Base64格式的图片

结合你的场景,需要先把Base64图片转成Blob(因为TinyPNG API接受二进制数据),再加上Basic Auth验证发起请求。具体步骤如下:

第一步:Base64转Blob工具函数

先写一个函数把data:image/png;base64,...格式的字符串转成Blob:

function base64ToBlob(base64Image) {
  // 去掉Base64前缀,只保留编码部分
  const base64Content = base64Image.split(",")[1];
  const byteCharacters = atob(base64Content);
  const byteArrays = [];

  // 分批处理字符,避免内存问题
  for (let offset = 0; offset < byteCharacters.length; offset += 512) {
    const slice = byteCharacters.slice(offset, offset + 512);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }

  // 根据图片实际类型调整MIME类型(比如JPG用image/jpeg)
  return new Blob(byteArrays, { type: "image/png" });
}

第二步:调用TinyPNG API发起压缩请求

const compressWithTinyPNG = async (base64Image) => {
  const TINYPNG_API_KEY = "你的TinyPNG API密钥";
  // TinyPNG的Basic Auth要求用户名是`api`,密码是你的API密钥
  const authString = btoa(`api:${TINYPNG_API_KEY}`);
  const imageBlob = base64ToBlob(base64Image);

  try {
    const response = await fetch("https://api.tinify.com/shrink", {
      method: "POST",
      headers: {
        "Authorization": `Basic ${authString}`
        // 不需要手动设置Content-Type,浏览器会自动根据Blob类型填充
      },
      body: imageBlob
    });

    if (!response.ok) {
      throw new Error(`压缩请求失败: ${response.statusText}`);
    }

    // 解析响应,TinyPNG会返回压缩后的图片URL和相关信息
    const compressResult = await response.json();
    console.log("压缩详情:", compressResult.output);
    
    // 可选:获取压缩后的图片并转成可使用的格式(比如Base64)
    const compressedImageResp = await fetch(compressResult.output.url);
    const compressedBlob = await compressedImageResp.blob();
    const compressedBase64 = URL.createObjectURL(compressedBlob);
    
    return compressedBase64; // 返回压缩后的图片地址,用于页面展示或上传
  } catch (error) {
    console.error("图片压缩出错:", error);
    throw error;
  }
};

// 调用示例:传入你的Base64图片字符串
// compressWithTinyPNG("data:image/png;base64,iVBORw0KGgoA...")
//   .then((compressedUrl) => { /* 处理压缩后的图片 */ })
//   .catch((err) => { /* 处理错误 */ });

注意事项

  • 确保你的TinyPNG API密钥正确,并且没有超出调用次数限制(免费版每月500次)
  • 如果是JPG图片,记得把base64ToBlob里的MIME类型改成image/jpeg
  • 压缩后的图片URL是临时的,若需要长期保存,建议下载后上传到自己的存储服务

内容的提问来源于stack exchange,提问作者Marian Rick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:12:29