проходя с использованием одного и того же параметра URI, получая два разных результата - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь получить список 100 билетов службы поддержки от API. URL ниже.

https://sdpondemand.manageengine.com/app/itdesk/api/v3/requests?input_data={"list_Info":{"row_count":100,"start_index":101}}

Я могу выдавать успешные результаты, это означает, что он возвращает 100 строк, начиная с индекса 101, когда я помещаю uri в строку, подобную этой:

string extra = "app/itdesk/api/v3/requests?input_data={\"list_info\":{\"row_count\":100,\"start_index\":101}}";

но если я попытаюсь поместить json в классы, а затем сериализовать его с библиотекой Json.Net, он потерпит неудачу, то есть вернет только 10 строк по индексу 1.

private class input_data
{
    public list_info list_Info = new list_info();
}
private class list_info
{
    public int row_count = 100;
    public int start_index = 101;
}

input_data input = new input_data();
string json = Newtonsoft.Json.JsonConvert.SerializeObject(input);
string extra1 ="app/itdesk/api/v3/requests?input_data="+json;

Я смотрю на оба запроса, которые появляются там точно так же. что я делаю не так?

как выглядят переменные в коде

extra: app/itdesk/api/v3/requests?input_data={"list_info":{"row_count":100,"start_index":101}}
extra1: app/itdesk/api/v3/requests?input_data={"list_Info":{"row_count":100,"start_index":101}}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Передача сериализованного объекта DTO в запросе Get не является правильным способом реализации API. Запрос на получение должен иметь параметры, а не объект сериализации. Если вы хотите сделать это и должны отправить объект, то почему бы не использовать почтовый запрос.

Пример реализации для API отдыха может быть следующим:

Через GET

[Route("{rowCount}/{startIndex}"), HttpGet]
public IHttpActionResult Get(int rowCount, int startIndex)
{
     //Your logic Implementation
}

вызов будет как

www.xyz.com/controllerName/100/101

Это остальная реализация запроса

По почте

[Route(""), HttpPost]
public IHttpActionResult Post([FromBody]YourDTOClass obj)
{
     //Your logic Implementation
}

Например, у вас есть класс DTO

//In C# the class name should be capital
private class ListInfo
{
    //In c# the property name should be Capital
    public int RowCount {get; set;} = 100;    
    public int StartIndex {get; set;}= 101;
}

Таким образом, ваш метод Post будет выглядеть как

//Route attribute is for configuring the custom route 
//It is a feature in MVC 5
//FromBody attribute will search for data in the request body
[Route(""), HttpPost]
public IHttpActionResult Post([FromBody]ListInfo info)
{
     //Your logic Implementation
}

Если вы также используете C # для вызова API, то вы можете использовать HttpClient для передачи данных json-объекта вашего класса.

Отредактировано: Поскольку вы используете сторонний API, вам необходимо исправить вызов.

using (var client = new HttpClient())
{
     //Setting the base address of the server 
    client.BaseAddress = new Uri("https://sdpondemand.manageengine.com");

    //creating an anonymous object
    var jsonObject = new {
        input_data = new {
             row_count = 100,
             start_index = 101
        }
    };

    //Converting into the content string
    var content = new StringContent(JsonConvert.SerializeObject(jsonObject), Encoding.UTF8, "application/json");

    //waiting for the post request to complete
    var result = await client.PostAsync("app/itdesk/api/v3/requests", content);

    //reading the response string 
    string resultContent = await result.Content.ReadAsStringAsync();
    if (response.IsSuccessStatusCode)
    {
        //Deserialize your string into custom object here
        var obj = JsonConvert.DeserializeObject<YourDTO>(resultContent);
    }
    else
    {
        //Todo: Log the Exception here
        throw new Exception(contentString);
    }
}
0 голосов
/ 09 ноября 2018

дополнительно: app / itdesk / api / v3 / запросы? Input_data = {"list_info" {"row_count": 100, "start_index": 101}} extra1: приложение / itdesk / API / V3 / запросы input_data = { "list_Info": { "row_count": 100, "START_INDEX": 101}}? * * 1002

испортил информацию списка

дополнительно: app / itdesk / api / v3 / запросы? Input_data = {"list_info" {"row_count": 100, "start_index": 101}} extra1: приложение / itdesk / API / V3 / запросы input_data = { "list_info": { "ROW_COUNT": 100, "START_INDEX": 101}}? * +1008 *

[пожимает плечами эмодзи]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...