如何循环 RestClient 请求传递 id 然后附加到响应

Posted

技术标签:

【中文标题】如何循环 RestClient 请求传递 id 然后附加到响应【英文标题】:How to loop RestClient request passing id and then appending to response 【发布时间】:2021-09-20 05:20:32 【问题描述】:

我用来从中获取数据的 API 非常有限。我可以获取数据的唯一方法是通过 GET 请求传递我需要的记录的标识符。问题是我可能有多个需要数据的 ID。有没有一种有效的方法来循环请求并将 json 响应附加到 List 并将该 id 添加到该 JSON 中?

 private static List<Question> getQuestions(string bearer, List<int> customerids)
 
   //the example below passes the customer ID 1.  What I want to do is pass customerids

   var qq = new RestClient("https://server.test.net/api/customers/1/");
   qq.AddDefaultHeader("Authorization", bearer);
   var request = new RestRequest("questions");
   var response = qq.Execute(request);
   string rawResponse = response.Content;
   List<Question> questions = JsonConvert.DeserializeObject<List<Question>>(rawResponse);
              
   return questions;

我需要通过循环运行 API 调用(因此,如果客户 1、6、776 存在于 customerids 列表中,则调用它们)而不是当前将其设置为客户 1。然后我想将结果附加到rawResponse 连同客户 ID,因为它不存在于我拉回的数据中。

不幸的是,这可能不是运行它的最佳方式,并且与软件供应商就达到响应限制进行了多次对话,但这是我可以通过循环运行然后加入 customerid 来提取数据的唯一方法,因为它不存在在我拉回的数据中,即使我可以在 get 请求中使用它。

因此结果看起来像(其中客户 ID 不存在于响应中,但是通过在调用后从 customerids 列表传递并将所有 ID 附加到相同的响应数据集来添加:

customerid question id answer
1 43 true
6 76 Married
774 76 Single

问题类:

public class Question

public int QuestionID get; set;
public string answer get; set;

潜在的 foreach 需要一些帮助来为每个客户附加结果,并将关联的客户 ID 添加到结果中

foreach (var item in customerids)

var qq = new RestClient("https://system.test.net/api/customers/" + item + "/");
qq.AddDefaultHeader("Authorization", bearer);
var request = new RestRequest("questions");
var response = qq.Execute(request);
string rawResponse = response.Content;

【问题讨论】:

可以分享Question类的代码吗?一位客户可以有多个问题吗? 您是否尝试过使用 foreach 循环并将单个 customerid 传递给 URL 而不是 1 您好,感谢您的 cmets。我添加了 Question 类,虽然我确实有更多字段,但为了简单起见,只提供了主要的问题。是的,他们可能会给客户带来很多问题。 我也尝试了上面的 foreach,但是我将如何附加到每个客户的响应中?此外,我如何将客户 ID 作为另一个元素/字段添加到 rawresponse? API 响应中没有customerid?您需要在循环外创建一个问题列表。如果rawResponse 是问题集合的 json,那么您应该将 json 反序列化为 List,然后使用 AddRange 方法将其添加到另一个列表中。 【参考方案1】:

根据上面的cmets,你已经基本解决了。

我认为唯一尚未解决的部分是如何将 customerid 分配给 API 返回的问题。

从 API 收到 JSON 后,应将其反序列化为问题列表,然后将 CustomerId 分配给列表中的每个问题。

您可以使用 SELECT LINQ 方法或遍历问题列表。

在下面的代码中,我使用了SELECT LINQ方法。

public class Question

    public int CustomerId  get; set; 
    public int QuestionId  get; set; 
    public string Answer  get; set; 


private static List<Question> GetQuestions(string bearer, List<int> customerids)
    
        var list = new List<Question>();

        // Create RestClient with base address.
        var restClient = new RestClient("https://server.test.net/api");

        // Add authorization header.
        restClient.AddDefaultHeader("Authorization", bearer);

        // Loop thru customerids
        foreach (var customerid in customerids)
        
            // Create RestRequest with URL for each customerid.
            var request = new RestRequest($"api/customers/customerid/questions", Method.GET);

            var res = restClient.Execute(request);
            var content = res.Content;

            // Deserialize response to a list of Questions.
            // here I am assuming that the JSON returned from the API is for a list of Questions.
            var questions = JsonConvert.DeserializeObject<List<Question>>(content);

            // Creating new list of Questions with customerid assigned to them.
            // Here I am assuming that the JSON from the API does not have customerId value in it. 
            questions = questions.Select(q => new Question  Answer = q.Answer, QuestionId = q.QuestionId, CustomerId = customerid ).ToList();

            // Add questions to the list to be returned.
            list.AddRange(questions);
        
        return list;
    

希望这能帮助您解决问题。

【讨论】:

非常感谢,您帮了我很大的忙,而且我学会了在 API 调用中对需要更改的数据使用 LINQ。我是 C# 新手,非常感谢所有帮助。赞成:)

以上是关于如何循环 RestClient 请求传递 id 然后附加到响应的主要内容,如果未能解决你的问题,请参考以下文章

restclient火狐插件 以post方式请求,多个请求参数该怎么写

restclient,微信小程序请求sessionID不一样导致取不到指定session的解决办法

如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求!

如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求

CodeIgniter 将 POST 数据从 RestClient 传递到 RestServer API

如何正确格式化发布请求的正文?