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 身份验证不起作用