【问题标题】:RestSharp JSON Parameter PostingRestSharp JSON 参数发布
【发布时间】:2011-09-12 20:49:15
【问题描述】:

我正在尝试对我的 MVC 3 API 进行非常基本的 REST 调用,并且我传入的参数未绑定到操作方法。

客户

var request = new RestRequest(Method.POST);

request.Resource = "Api/Score";
request.RequestFormat = DataFormat.Json;

request.AddBody(request.JsonSerializer.Serialize(new { A = "foo", B = "bar" }));

RestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

服务器

public class ScoreInputModel
{
   public string A { get; set; }
   public string B { get; set; }
}

// Api/Score
public JsonResult Score(ScoreInputModel input)
{
   // input.A and input.B are empty when called with RestSharp
}

我错过了什么吗?

【问题讨论】:

    标签: c# json asp.net-mvc-3 rest restsharp


    【解决方案1】:

    您不必自己序列化正文。做吧

    request.RequestFormat = DataFormat.Json;
    request.AddJsonBody(new { A = "foo", B = "bar" }); // Anonymous type object is converted to Json body
    

    如果您只想要 POST 参数(它仍然会映射到您的模型并且效率更高,因为没有对 JSON 的序列化),请执行以下操作:

    request.AddParameter("A", "foo");
    request.AddParameter("B", "bar");
    

    【讨论】:

    • 两者。不过,第二种方法要快得多。
    • 您也可以使用AddObject(new { A = "foo", B = "bar" }) 获取对象属性并将其转换为参数
    • 对于那些想要自己json化的人:request.AddParameter("text/json", body, ParameterType.RequestBody);
    • @KylePatterson 你也可以实现自己的 ISerializer 并设置 RestClient.JsonSerializer 来使用它。
    • 在您的第一个示例中,request.AddBody(new ... 之后有一个过时的括号。
    【解决方案2】:

    在当前版本的 RestSharp (105.2.3.0) 中,您可以将 JSON 对象添加到请求正文:

    request.AddJsonBody(new { A = "foo", B = "bar" });
    

    此方法将内容类型设置为 application/json 并将对象序列化为 JSON 字符串。

    【讨论】:

    • 如何附加文件到这个请求?
    • 如何命名对象?例如。如果你需要发送 "details" : { "extra" : "stuff" } ?
    • @OPV 您可以像这样向请求中添加文件:request.AddFile(pathToTheFile);
    • @mdegges 如果您使用匿名类作为主体以使 JSON 看起来像您的示例那样设置 RestSharp 请求:var client = new RestSharp.RestClient("http://your.api.com"); var request = new RestSharp.RestRequest("do-something", Method.POST); var body = new {details = new {extras = "stuff"}}; request.AddJsonBody(body); var response = client.Execute(request);
    【解决方案3】:

    这对我有用,就我而言,这是登录请求的帖子:

    var client = new RestClient("http://www.example.com/1/2");
    var request = new RestRequest();
    
    request.Method = Method.POST;
    request.AddHeader("Accept", "application/json");
    request.Parameters.Clear();
    request.AddParameter("application/json", body , ParameterType.RequestBody);
    
    var response = client.Execute(request);
    var content = response.Content; // raw content as string  
    

    正文:

    {
      "userId":"sam@company.com" ,
      "password":"welcome" 
    }
    

    【讨论】:

    • 如何将正文插入到 c# 代码中? as string body = "{ "userId":"sam@company.com" , "password":"welcome" }";不起作用。
    • 你应该使用 "" 而不是 " string body = @" { ""userid"", ... "
    【解决方案4】:

    希望这会对某人有所帮助。它对我有用 -

    RestClient client = new RestClient("http://www.example.com/");
    RestRequest request = new RestRequest("login", Method.POST);
    request.AddHeader("Accept", "application/json");
    var body = new
    {
        Host = "host_environment",
        Username = "UserID",
        Password = "Password"
    };
    request.AddJsonBody(body);
    
    var response = client.Execute(request).Content;
    

    【讨论】:

    • 看起来request.AddHeader("Accept", "application/json"); 是正确答案。
    【解决方案5】:

    如果您有 List 的对象,您可以将它们序列化为 JSON,如下所示:

    List<MyObjectClass> listOfObjects = new List<MyObjectClass>();
    

    然后使用addParameter:

    requestREST.AddParameter("myAssocKey", JsonConvert.SerializeObject(listOfObjects));
    

    您需要将请求格式设置为JSON

    requestREST.RequestFormat = DataFormat.Json;
    

    【讨论】:

      【解决方案6】:

      您可能需要从请求正文中反序列化您的匿名 JSON 类型。

      var jsonBody = HttpContext.Request.Content.ReadAsStringAsync().Result;
      ScoreInputModel myDeserializedClass = JsonConvert.DeserializeObject<ScoreInputModel>(jsonBody);
      

      【讨论】:

        【解决方案7】:

        这是完整的控制台工作应用程序代码。请安装 RestSharp 包。

        using RestSharp;
        using System;
        
        namespace RESTSharpClient
        {
            class Program
            {
                static void Main(string[] args)
                {
                string url = "https://abc.example.com/";
                string jsonString = "{" +
                        "\"auth\": {" +
                            "\"type\" : \"basic\"," +
                            "\"password\": \"@P&p@y_10364\"," +
                            "\"username\": \"prop_apiuser\"" +
                        "}," +
                        "\"requestId\" : 15," +
                        "\"method\": {" +
                            "\"name\": \"getProperties\"," +
                            "\"params\": {" +
                                "\"showAllStatus\" : \"0\"" +
                            "}" +
                        "}" +
                    "}";
        
                IRestClient client = new RestClient(url);
                IRestRequest request = new RestRequest("api/properties", Method.POST, DataFormat.Json);
                request.AddHeader("Content-Type", "application/json; CHARSET=UTF-8");
                request.AddJsonBody(jsonString);
        
                var response = client.Execute(request);
                Console.WriteLine(response.Content);
                //TODO: do what you want to do with response.
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 2021-10-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多