从 Netsuite Rest 获取格式错误的输出 API
Getting malformed output from Netsuite Rest API
我正在访问 NetSuite Rest API,但有时 API 收到错误请求(例如用户输入了错误的值),在这种情况下,body returns格式错误。
当我使用 Postman 测试 URL 和相同的值以及 headers 时,它正确显示了 BadReuest Body,但 cUrl 中的同样的事情正在返回乱码结果。
它只发生在 (400)BadRequests。
这是我从 Postman 那里得到的:
{
"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"
}
]
}
这是我从 cUrl 得到的:
ps:
- 我知道我可以从 suiteQL 获得这个结果或者先检查产品是否存在,但我对如何以正确的方式获得这些数据感兴趣。
- 访问 NetSuite Rest API 的应用程序是由 ASP.NET Core 3.1 编写的,我得到的结果与 cUrl 相同,但格式不正确。
我的团队在将 Netsuite REST API 与 .NET Core 3.1 一起使用时也 运行 遇到了类似的问题(Bad Request 上的格式错误消息)。我们验证了从 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"
};
}
}
}
我正在访问 NetSuite Rest API,但有时 API 收到错误请求(例如用户输入了错误的值),在这种情况下,body returns格式错误。
当我使用 Postman 测试 URL 和相同的值以及 headers 时,它正确显示了 BadReuest Body,但 cUrl 中的同样的事情正在返回乱码结果。 它只发生在 (400)BadRequests。
这是我从 Postman 那里得到的:
{
"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"
}
]
}
这是我从 cUrl 得到的:
ps:
- 我知道我可以从 suiteQL 获得这个结果或者先检查产品是否存在,但我对如何以正确的方式获得这些数据感兴趣。
- 访问 NetSuite Rest API 的应用程序是由 ASP.NET Core 3.1 编写的,我得到的结果与 cUrl 相同,但格式不正确。
我的团队在将 Netsuite REST API 与 .NET Core 3.1 一起使用时也 运行 遇到了类似的问题(Bad Request 上的格式错误消息)。我们验证了从 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"
};
}
}
}