首页 > 解决方案 > 从 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"
        }
    ]
}

这是我从 cUrl 得到的: 在此处输入图像描述

ps:

  1. 我知道我可以从 suiteQL 获得此结果或首先检查产品是否存在,但我对如何以正确的方式获取此数据感兴趣。
  2. 访问 NetSuite Rest API 的应用程序是由 ASP.NET Core 3.1 编写的,我得到的结果与 cUrl 相同,但格式错误。

标签: curlnetsuiterest

解决方案


我的团队在将 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"
                };
            }
        }
}

推荐阅读