C#-OLAP TM1的JSON主体参数-通过RestSharp进行补丁调用

问题描述

我正在编写一个C#框架以与IBM的PA Rest Api交互,我弄清楚了邮递员需要的调用,并使用这些示例将这些调用构建到了我未来项目的框架中。

我相对来说是休息api和json的新手,所以这可能是一个真正的转储问题,但是我不知道如何以最佳方式构建Body Parameter。让我告诉你:

    request.AddParameter("application/json","{\r\n    \"Cells\": [\r\n        {\r\n            \"Tuple@odata.bind\": [\r\n                \"Dimensions('Version')/Hierarchies('Version')/Elements('Actual')\",\r\n                \"Dimensions('Year')/Hierarchies('Year')/Elements('2018')\",\r\n                \"Dimensions('Period')/Hierarchies('Period')/Elements('Jan')\",\r\n                \"Dimensions('Currency')/Hierarchies('Currency')/Elements('Local')\",\r\n                \"Dimensions('Region')/Hierarchies('Region')/Elements('England')\",\r\n                \"Dimensions('Department')/Hierarchies('Department')/Elements('Executive General and Administration')\",\r\n                \"Dimensions('Account')/Hierarchies('Account')/Elements('Meals')\",\r\n                \"Dimensions('General Ledger Measure')/Hierarchies('General Ledger Measure')/Elements('Amount')\"\r\n            ]\r\n        }\r\n    ],\r\n    \"Value\": \"1234\"\r\n}",ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

此示例显示了从Postman那里获取到TM1中的值的主体外观。

因此Dimension Count也是动态的,名称也只是动态的,我只是想使用一个数组,但这并不是很漂亮,而且我真的可以肯定有人为它提供了一个不错而又容易的解决方案,我只是不知道。 / p>

感谢您的帮助!

解决方法

我现在这样解决了它,也许有人对此感兴趣,它可能不是最好的方法,但是可行。

    /// <summary>
    /// Update string or numeric cells in TM1
    /// </summary>
    /// <param name="Value">The Value you want to insert,for numeric values u have to convert it to a string before calling the methode</param>
    /// <param name="Cube">Target cube</param>
    /// <param name="Dimensions">2 Dimensional Array,the 2nd dimension contains the TM1 dim infos,0 = DimName,1=Hierarchy name (can be empty),2 = Element Name</param>
    /// <returns></returns>
    public string CellPutValue(string Value,string Cube,string[,] Dimensions )
    {
        //create body header
        string body = @"{
                            ""Cells"":[
                                { ""Tuple@odata.bind"": [";
        for (int i = 0; i < Dimensions.GetLength(0); i++)
        {
            //check if array data is correct...
            if (Dimensions[i,0] == "")
                break;

            //for cleanness,used temp vars for reading out the array and build the body
            string dim = Dimensions[i,0];
            string hierarchy = Dimensions[i,1] == null ? Dimensions[i,0] : Dimensions[i,1];
            string dimEl = Dimensions[i,2];

            //loop through the array and construct the body json
            if (i < Dimensions.GetLength(0)-1)
            {
                body = body + @"
                                       ""Dimensions('" + dim + @"')/Hierarchies('" + hierarchy + @"')/Elements('" + dimEl + @"')"",";
            }
            else
            {
                body = body + @"
                                       ""Dimensions('" + dim + @"')/Hierarchies('" + hierarchy + @"')/Elements('" + dimEl + @"')""";
            }
        }
        //add body footer
        body = body + @"
                    ]
            }
            ],""Value"":""" + Value + @"""
        }";

        var request = new RestRequest("Cubes('" + Cube + "')/tm1.Update",Method.POST);      
        request.AddCookie(sessionCookie.Name,sessionCookie.Value);
        request.AddHeader("Content-Type","application/json");
        request.AddParameter("application/json",body,ParameterType.RequestBody);
        IRestResponse response = restClient.Execute(request);
        //return response
        return response.Content;
    }