使用Google Apps Script调用NameApi获取姓名数据报错求助
解决NameApi + Google Apps Script调用错误问题
我尝试使用NameApi的姓名解析服务,通过Google Apps Script获取特定姓名的以下字段:
- SURNAME
- GIVENNAME
- GIVENNAME2
- QUALIFIER
- GENDER
- STATUS
但运行代码时出现400 Bad Request错误,以下是原代码及问题分析和修正方案:
原代码
function TestNameApi() { const apiKey = "###"; // 请设置你的API密钥 var url = "https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=" + apiKey; var Name = { "context": { "priority": "REALTIME", "properties": [] }, "inputPerson": { "type": "NaturalInputPerson", "personName": { "nameFields": [{ "string": "BRANDYN KRAMER", "fieldType": "GIVENNAME" }] }, "gender": "UNKNOWN" } } var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(Name) }; var response = UrlFetchApp.fetch(url, options).getContentText(); Logger.log(response); }
问题分析
- 输入字段类型错误:原代码中将完整姓名
BRANDYN KRAMER标记为GIVENNAME(名)类型,这会导致NameApi无法正确解析姓名结构,直接返回400请求错误。 - 缺少错误处理:未添加异常捕获逻辑,无法直观看到具体错误信息。
修正方案
方案1:传入完整姓名(推荐)
将nameFields的fieldType改为FULLNAME,让服务自动解析姓名结构:
function TestNameApi() { const apiKey = "###"; // 替换为你的API密钥 const url = `https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=${apiKey}`; // 修正输入格式:完整姓名对应FULLNAME类型 const requestBody = { "context": { "priority": "REALTIME", "properties": [] }, "inputPerson": { "type": "NaturalInputPerson", "personName": { "nameFields": [{ "string": "BRANDYN KRAMER", "fieldType": "FULLNAME" }] }, "gender": "UNKNOWN" } }; const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(requestBody), muteHttpExceptions: true // 开启后可获取详细错误响应 }; try { const response = UrlFetchApp.fetch(url, options); const responseJson = JSON.parse(response.getContentText()); // 提取需要的字段 const parsedPerson = responseJson.matches[0].personName; Logger.log("SURNAME: " + parsedPerson.surname?.string); Logger.log("GIVENNAME: " + parsedPerson.givenNames[0]?.string); Logger.log("GIVENNAME2: " + parsedPerson.givenNames[1]?.string || "无"); Logger.log("QUALIFIER: " + parsedPerson.qualifiers[0]?.string || "无"); Logger.log("GENDER: " + responseJson.matches[0].gender?.gender); Logger.log("STATUS: " + responseJson.matches[0].matchLevel); } catch (e) { Logger.log("请求错误: " + e.message); } }
方案2:拆分姓和名传入
如果明确知道姓名结构,可分别传入GIVENNAME和SURNAME:
function TestNameApi() { const apiKey = "###"; // 替换为你的API密钥 const url = `https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=${apiKey}`; const requestBody = { "context": { "priority": "REALTIME", "properties": [] }, "inputPerson": { "type": "NaturalInputPerson", "personName": { "nameFields": [ {"string": "BRANDYN", "fieldType": "GIVENNAME"}, {"string": "KRAMER", "fieldType": "SURNAME"} ] }, "gender": "UNKNOWN" } }; const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(requestBody), muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(url, options); const responseJson = JSON.parse(response.getContentText()); // 提取字段逻辑同方案1 Logger.log(JSON.stringify(responseJson, null, 2)); } catch (e) { Logger.log("请求错误: " + e.message); } }
关键优化点
- 修正
fieldType匹配输入内容的类型; - 添加
muteHttpExceptions: true,方便查看详细错误响应; - 加入
try-catch捕获异常,提升代码健壮性; - 新增字段提取逻辑,直接输出你需要的目标字段。
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

