curl - 从 Netsuite Rest API 获取格式错误的输出
问题描述
我正在访问 NetSuite Rest API,但有时 API 收到错误请求(例如用户输入错误的值),在这种情况下,正文返回格式错误。
当我使用 Postman 测试 URL 以及相同的值和标头时,它正确显示了 BadReuest 正文,但 cUrl 中的相同内容正在返回乱码结果。它只发生在 (400)BadRequests 上。
这是我从邮递员那里得到的:
{
"type": "https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1",
"title": "Bad Request",
"status": 400,
"o:errorDetails": [
{
"detail": "Invalid value for the resource or sub-resource field 'eid'. Provide a valid value.",
"o:errorUrl": "/services/rest/record/v1/inventoryItem/eid:1111111130/price",
"o:errorCode": "INVALID_ID"
}
]
}
ps:
- 我知道我可以从 suiteQL 获得此结果或首先检查产品是否存在,但我对如何以正确的方式获取此数据感兴趣。
- 访问 NetSuite Rest API 的应用程序是由 ASP.NET Core 3.1 编写的,我得到的结果与 cUrl 相同,但格式错误。
解决方案
我的团队在将 Netsuite REST API 与 .NET Core 3.1 一起使用时也遇到了类似的问题(错误请求上的错误消息格式错误)。我们验证了从 Postman 返回的响应没有格式错误(如上所述)。从那里,我们能够确定从 Netsuite 返回的错误响应是 gzip 压缩的,Postman 会自动处理。我们将以下代码添加到我们的 .NET 项目中以使其正常工作:
public class GzipUtils
{
public void CopyTo(Stream src, Stream dest)
{
var bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public string Unzip(byte[] bytes)
{
using var msi = new MemoryStream(bytes);
using var mso = new MemoryStream();
using var gs = new GZipStream(msi, CompressionMode.Decompress);
CopyTo(gs, mso);
return Encoding.UTF8.GetString(mso.ToArray());
}
}
public static class NetsuiteResponseTranslationUtils
{
public static NetsuiteError ToNetsuiteError(this HttpResponseMessage response, ICompressionUtils compressionUtils = null)
{
var errorContent = string.Empty;
if (!response.IsSuccessStatusCode && response.Content != null)
{
var bytes = response.Content.ReadAsByteArrayAsync().Result;
if (compressionUtils == null)
{
compressionUtils = new GzipUtils();
}
errorContent = compressionUtils.Unzip(bytes)
.Replace("o:errorCode", "errorCode")
.Replace("o:errorDetails", "errorDetails");
}
if (string.IsNullOrEmpty(errorContent))
{
return null;
}
try
{
var error = JsonConvert.DeserializeObject<NetsuiteError>(errorContent);
return error;
}
catch
{
return new NetsuiteError
{
Title = "Unparsable Error Content"
};
}
}
}
推荐阅读
- windows - 是否可以在没有 Windows 10 专业版的情况下使用 Docker?
- jakarta-ee - 包 com.sun.xml.internal.ws.developer
- regex - 如何通过 Redshift psql 提取正则表达式组
- cassandra - 配置 cassandra 3.11.2 以接受 ec2 上的远程连接
- java - LibGDX - Bullet - 3D 碰撞检测未检测到碰撞
- java - LinkedHashMap 或 Multimap
- vba - 从 excel 生成 PDF 并在 XChange Viewer 中打开
- shell - 在 Post build 中执行 Shell 脚本并存储输出
- javascript - 如何获取 HTMLElement 的所有相应样式表?
- c# - 我不知道如何让我的班级使用彼此的信息