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

React Native请求触发okhttp3 Headers IllegalArgumentException异常求助

问题排查与解决方案

从你提供的异常栈和代码来看,这个IllegalArgumentException是OkHttp在校验请求头的名称或值时抛出的——OkHttp对HTTP请求头的格式有严格规范,不符合要求的头名或头值都会触发这个错误。结合你的实现逻辑,问题大概率出在直接将设备信息作为请求头传递时,部分字段不符合HTTP头的格式要求,下面是具体的排查和修复步骤:

核心问题分析

OkHttp的Headers$Builder.checkNameAndValue方法会严格校验:

  • 头名称必须是合法的HTTP Token(不能包含空格、控制字符等特殊符号)
  • 头值不能包含CR(回车)、LF(换行)等控制字符,也不能是null或空字符串(部分场景下)
  • 所有头值必须是字符串类型(你代码中的isTablet、isEmulator是布尔值,直接传递可能导致序列化异常)

看你的代码,你把react-native-device-info返回的所有字段直接作为请求头的键值对,这里有几个潜在风险点:

  • 部分设备信息字段可能返回null或空字符串(比如carrier在无SIM卡的设备上)
  • 布尔类型的字段(isTablet、isEmulator)直接作为头值,axios/OkHttp可能无法正确处理
  • 某些设备返回的字段值可能包含控制字符(比如设备名称里的特殊符号)

修复方案

你需要对请求头的字段做统一处理,确保所有头名和头值符合HTTP规范,下面是修改后的代码示例:

var DeviceInfo = require('react-native-device-info'); 

// 统一处理设备信息:转字符串、处理空值、移除控制字符
const getSafeHeaderValue = (value) => {
  if (value == null) return 'unknown';
  // 将所有值转为字符串(包括布尔值)
  let strValue = String(value);
  // 移除HTTP头不允许的控制字符(回车、换行、制表符等)
  return strValue.replace(/[\x00-\x1F\x7F]/g, '');
};

// 用处理函数包裹所有设备信息字段
const deviceName = getSafeHeaderValue(DeviceInfo.getDeviceName());
const apiLevel = getSafeHeaderValue(DeviceInfo.getAPILevel());
const brand = getSafeHeaderValue(DeviceInfo.getBrand());
const buildNumber = getSafeHeaderValue(DeviceInfo.getBuildNumber());
const carrier = getSafeHeaderValue(DeviceInfo.getCarrier());
const deviceCountry = getSafeHeaderValue(DeviceInfo.getDeviceCountry());
const deviceLocale = getSafeHeaderValue(DeviceInfo.getDeviceLocale());
const manufacturer = getSafeHeaderValue(DeviceInfo.getManufacturer());
const model = getSafeHeaderValue(DeviceInfo.getModel());
const readableVersion = getSafeHeaderValue(DeviceInfo.getReadableVersion());
const serialNumber = getSafeHeaderValue(DeviceInfo.getSerialNumber());
const systemName = getSafeHeaderValue(DeviceInfo.getSystemName());
const systemVersion = getSafeHeaderValue(DeviceInfo.getSystemVersion());
const uniqueId = getSafeHeaderValue(DeviceInfo.getUniqueID());
const version = getSafeHeaderValue(DeviceInfo.getVersion());
const isTablet = getSafeHeaderValue(DeviceInfo.isTablet());
const isEmulator = getSafeHeaderValue(DeviceInfo.isEmulator());

export const getCode = async (phone) => await axios({ 
  method: 'post', 
  url: `${url}/api/mobile/external/code_send`, 
  headers: { 
    apiLevel, 
    brand, 
    buildNumber, 
    carrier, 
    deviceCountry, 
    deviceLocale, 
    deviceName, 
    manufacturer, 
    model, 
    readableVersion, 
    serialNumber, 
    systemName, 
    systemVersion, 
    uniqueId, 
    version, 
    isTablet, 
    isEmulator 
  }, 
  data: {phone}, 
  timeout: 10000, 
}); 

额外优化建议

  1. 规范头名称格式:HTTP头名称通常采用kebab-case(比如api-level代替apiLevel),虽然不是强制要求,但更符合行业规范,也能避免潜在的兼容性问题。
  2. 空值过滤:如果某些字段为空时不需要传递,可以在构建headers时过滤掉:
    const rawHeaders = { /* 处理后的头对象 */ };
    const filteredHeaders = Object.fromEntries(
      Object.entries(rawHeaders).filter(([key, value]) => value !== 'unknown')
    );
    
  3. 调试验证:在发送请求前,可以先打印处理后的headers对象,检查是否还有异常值:
    console.log('Processed headers:', filteredHeaders);
    

内容的提问来源于stack exchange,提问作者Роман Александрович

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:10