通过 RestSharp C# 将 JSON 数组发布到 PHP API

Posted

技术标签:

【中文标题】通过 RestSharp C# 将 JSON 数组发布到 PHP API【英文标题】:Posting JSON array to PHP API via RestSharp C# 【发布时间】:2021-10-01 07:02:37 【问题描述】:

我正在使用 C# 制作一个应用程序,需要将 JSON 数组发布到我的 php api 文件中。我有这个代码:

        string JSONString = JsonConvert.SerializeObject(dt);
        var client = new RestClient(ipadress);
        var request = new RestRequest(apiendpoint, Method.POST);
        request.RequestFormat = DataFormat.Json;
        var body = new
        
            key = apikey,
            items = JSONString               

        ;
        request.AddJsonBody(body);
        var response = client.Post(request);
        var content = response.Content; // Raw content as string
        MessageBox.Show(content.ToString());

所以,问题在于items = JSONString 作为字符串而不是数组发送,并且 PHP API 文件没有将其作为数组输入(我无法从行中提取值)。我没有找到任何信息,我怎样才能在 RestSharp 中制作二级数组,比如(它只是虚构的代码,它不起作用:

var body = new
    
        key = apikey,
        items =  
           foreach(DataRow row in dt.Rows)
              
                 aid = row["aid"].ToString(),
                 item= row["item"].ToString(),
                 desc= row["desc"].ToString()
              
                      

    ;

我的 PHP api 文件(仅供参考,我正在使用框架):

$resultArray = array_map("html_entity_decode", $data);
foreach ($resultArray as $items) 
    $db->insert("test_items", ["aid"=>$items->aid, "item"=>$items->item, "desc"=>$items->desc]);

dnd($resultArray['items']);

【问题讨论】:

【参考方案1】:

您可以这样做,C# 很好地支持匿名类型,因此您可以发出任何所需的 POCO 模式:

在编译时(严格的 API,已知所有属性,无需打开/关闭某些东西)我们这样做:

var body = new
    
        key = apikey,
        items = dt
              .Rows
              .Cast<DataRow>() 
              .Select(x=> new
              
                 aid = x["aid"].ToString(),
                 item= x["item"].ToString(),
                 desc= x["desc"].ToString()
              )
              .ToList()
       
    ;

在运行时(如果您的属性集仅在运行时已知)我们会这样做:

dynamic body = new ExpandoObject();
body.key = apiKey;
body.items = dt
              .Rows
              .Cast<DataRow>() 
              .Select(x=> new
              
                 aid = x["aid"].ToString(),
                 item= x["item"].ToString(),
                 desc= x["desc"].ToString()
              )
              .ToList();

【讨论】:

感谢您的回答,但它给我带来了错误:datarowcollection does not contain a definition for select。谷歌搜索:) 此代码在 button_click 处执行。它从 dataGridView 获取数据,将 em 推送到 DataTable,我需要将其作为 JSON 发布到我的 PHP API 查看带有 Cast 的更新版本。此外,这里是 msdn 上的 ExpandoObject - docs.microsoft.com/en-us/dotnet/api/… 您只需要包含 System.DynamicSystem.Linq 命名空间。 是的,我想通了。但是代码现在将 NULL 发布到 API .. 将寻找原因 :) 谢谢您的帮助! 我没弄明白,datatable里面填满了数据,但是当我发布到API时,它显示```array(2) ["key"] => string(29) "XXX -XXX-XXX" ["项目"]=> NULL

以上是关于通过 RestSharp C# 将 JSON 数组发布到 PHP API的主要内容,如果未能解决你的问题,请参考以下文章

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

c# JSON REST 响应通过 3 种不同的方法(WebRequest、RESTSharp、HttpClient)是空的,但 Postman 和浏览器可以工作

在 C# 中,如何为具有多个嵌套数组的 JSON 对象建模?

如何将 json 格式的有效负载附加到 RestSharp 请求中?

csharp RestSharp将JSON反序列化为动态

RestSharp用法小结