Bài viết tham số JSON của RestSharp


141

Tôi đang cố gắng thực hiện một cuộc gọi REST rất cơ bản đến API MVC 3 của mình và các tham số tôi truyền vào không ràng buộc với phương thức hành động.

Khách hàng

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);

Người phục vụ

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
}

Am i thiếu cái gì ở đây?

Câu trả lời:


211

Bạn không cần phải tuần tự hóa cơ thể. Cứ làm đi

request.RequestFormat = DataFormat.Json;
request.AddBody(new { A = "foo", B = "bar" }); // uses JsonSerializer

Nếu bạn chỉ muốn các thông số POST thay thế (vẫn sẽ ánh xạ tới mô hình của bạn và hiệu quả hơn rất nhiều vì không có tuần tự hóa thành JSON), hãy làm điều này:

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

4
Cả hai. Cách tiếp cận thứ hai là nhanh hơn nhiều mặc dù.
Wesley Tansey

4
Bạn cũng có thể thực AddObject(new { A = "foo", B = "bar" })hiện các thuộc tính đối tượng và chuyển đổi chúng thành các tham số
John Sheehan

62
Dành cho những ai muốn tự đùa giỡn:request.AddParameter("text/json", body, ParameterType.RequestBody);
Kyle Patterson

1
@KylePatterson bạn cũng có thể triển khai ISerializer của riêng mình và đặt RestClient.JsonSerializer để sử dụng nó.
John Sheehan

2
Có một request.AddBody(new ...ví dụ lỗi thời sau ví dụ đầu tiên của bạn.
Benjamin

54

Trong phiên bản hiện tại của RestSharp (105.2.3.0), bạn có thể thêm một đối tượng JSON vào phần thân yêu cầu với:

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

Phương thức này đặt loại nội dung thành application / json và tuần tự hóa đối tượng thành chuỗi JSON.


1
Làm thế nào để đính kèm tập tin vào yêu cầu này?
OPV

1
Làm thế nào để bạn đặt tên cho đối tượng? ví dụ. nếu bạn cần gửi "chi tiết": {"thêm": "thứ"}?
mdegges

@OPV Bạn có thể thêm một tệp vào yêu cầu như thế này: request.AddFile (pathToTheFile);
Chris Morgan

1
@mdegges Nếu bạn đang sử dụng một lớp ẩn danh làm phần thân để có JSON trông giống như ví dụ của bạn, hãy thiết lập Yêu cầu RestSharp như thế này: 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);
Chris Morgan

43

Đây là những gì làm việc cho tôi, đối với trường hợp của tôi, đó là một bài đăng cho yêu cầu đăng nhập:

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  

thân hình :

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

2
Làm thế nào để bạn chèn cơ thể vào mã c # của bạn? như chuỗi body = "{" userId ":" sam@company.com "," password ":" welcome "}"; không hoạt động.
Kynao

1
Bạn nên sử dụng "" thay vì "chuỗi body = @" {"" userid "", ... "
Vitaly Ascheulov

7

Hy vọng điều này sẽ giúp được ai đó. Nó làm việc cho tôi -

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;

Hình như request.AddHeader("Accept", "application/json");là câu trả lời đúng.
Boudel Poudel

0

Nếu bạn có một Listđối tượng, bạn có thể tuần tự hóa chúng thành JSON như sau:

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

Và sau đó sử dụng addParameter:

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

Và bạn sẽ cần phải đặt định dạng yêu cầu thành JSON:

requestREST.RequestFormat = DataFormat.Json;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.