RestSharp JSON 参数发布

Posted

技术标签:

【中文标题】RestSharp JSON 参数发布【英文标题】:RestSharp JSON Parameter Posting 【发布时间】: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

我错过了什么吗?

【问题讨论】:

【参考方案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.
    
  

【讨论】:

以上是关于RestSharp JSON 参数发布的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 RESTSHARP 的 OAuth 2 身份验证不起作用

RestSharp.NetCore 中的 ExecuteAsyncPost 示例

使用 restsharp 反序列化 json 字符串

使用RESTSHARP进行OAuth 2身份验证不起作用

RestSharp:从结果中获取空值。调试结果时的数据虽然返回了 JSON