【问题标题】:Sending Batch REST requests to SAP Business One Service Layer using RestSharp使用 RestSharp 向 SAP Business One 服务层发送批量 REST 请求
【发布时间】:2020-09-08 07:03:51
【问题描述】:

我正在尝试使用 SAP Business One 服务层批处理来实现 REST 事务。 首先,在处理实际的数据修改请求之前,我想创建一个简单的帖子以在同一个请求中获取两个业务合作伙伴。我尝试编写一个 c# 应用程序,但我总是得到同样的错误:

{ "error" : { "code" : 242, "message" : { "lang" : "en-us", "value" : "Incomplete batch request body." } }

这是我正在使用的代码:

        public IRestResponse TestMultipart()
        {
            var client = new RestClient(new Uri(SERVICE_ROOT_URL));
            client.CookieContainer = CookieCnt;
            var request = new RestRequest("$batch", Method.POST)
            {
                AlwaysMultipartFormData = true
            };

            request.AddHeader("Content-Type", "multipart/mixed;boundary=batch_test1");

            request.AddBody(@"--batch_test1
Content-Type: application/http
Content-Transfer-Encoding:binary
GET /b1s/v1/Invoices(1)
--batch_batch_test1
Content-Type: application/http
Content-Transfer-Encoding:binary
GET /b1s/v1/Invoices(2)
--batch_test1--");

            return client.Execute(request);
        }

(此处未包含身份验证代码,它调用登录 API 并初始化 CookieContainer。它运行良好:我能够使用标准 GET 方法获得单个(而非多部分)请求的响应。)

我无法使用 Web 上的 RestSharp 库找到多部分请求的示例。有人可以帮忙吗?

谢谢。

【问题讨论】:

    标签: .net sap httpclient restsharp multipart


    【解决方案1】:

    好吧,原来我搞错了。我决定使用 HttpClient .Net 本机 API,它允许非常灵活地创建 Multipart REST 请求。由于我找不到关于如何创建多部分/混合内容的体面文档,并且将所有部分放在一起需要一些头疼,我在这里发布代码,以防有人发现它有用。这是请求处理程序,它驻留在 SessioneSL 类中,构造函数在其中打开服务层会话并将 cookie 存储到 CookieContainer 实例中,该实例是该类的属性(这仍然在 RestSharp 和因此我不会发布它。我会尽快将它转换为HttpClient版本,请问您是否需要它)。

        public Task<string> TestMultipartHC()
        {
            using (var handler = new HttpClientHandler()
            {
                CookieContainer = CookieCnt,
                Proxy = new WebProxy("127.0.0.1", 8888),    // this is for catching the POST in Fiddler
            })
            {
                HttpClient client = new HttpClient(handler)
                {
                    BaseAddress = new Uri(SERVICE_ROOT_URL),
                };
    
                var myBoundary = "--batch_test1";
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "$batch");
    
                request.Headers.Date = DateTime.UtcNow;
                request.Headers.Add("Accept", "application/json; charset=utf-8");
    
                MultipartContent mpContent = new MultipartContent("mixed", myBoundary);
                var sc = new StringContent("GET /b1s/v1/Invoices(1)");
                sc.Headers.ContentType = new MediaTypeHeaderValue("application/http");
    
                sc.Headers.Add("Content-Transfer-Encoding", "binary");
                mpContent.Add(sc);
    
                sc = new StringContent("GET /b1s/v1/Invoices(2)");
                sc.Headers.ContentType = new MediaTypeHeaderValue("application/http");
                sc.Headers.Add("Content-Transfer-Encoding", "binary");
                mpContent.Add(sc);
    
                request.Content = mpContent;
    
                var response = client.SendAsync(request).Result;
                return response.Content.ReadAsStringAsync();
            }
        }
    

    要调用此方法,您需要如下代码:

    SessioneSL sessione = new SessioneSL();
    Task<string> tk = sessione.TestMultipartHC();
    tk.Wait();
    Response.Write(tk.Result);
    

    2020 年 5 月 6 日更新: 上面的示例实际上并没有返回两个对象,只是第一个,我不知道为什么。 无论如何,事务功能只发生在嵌套在一个多部分段内的“变更集”中。变更集只允许 POST、PUT、DELETE、PATCH 动词,不允许获取。 SAP 文档很糟糕,所以我还是要尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多