HttpWebRequest GET с объектом в качестве параметра - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь вызвать API из Windows Сервиса. API написано в ASP MVC. Пока что я создаю запросы примерно так:

private List<T> GetCollectionFromApi<T>(string url)
    {
        List<T> result = new List<T>();

        try
        {
            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = "GET";

            using (var response = (HttpWebResponse) request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(stream))
                    {
                        result.AddRange(JsonConvert.DeserializeObject<List<T>>(sr.ReadToEnd()));
                    }
                }
            }
        }
        catch (Exception e)
        {
            // handle err
        }

        return result;
    }

Это все нормально, но теперь мне нужно передать параметр с моим GET-запросом. Этот параметр является объектом, а не примитивным типом.

Разобрать его, свойство за свойством, в строку запроса? Или я как-то добавляю его в заголовок запроса? Я планирую полагаться на DefaultModelBinder в контроллере API. Любой план будет оценен.

Ответы [ 3 ]

3 голосов
/ 17 января 2020

Сторона API:

Вам необходимо использовать атрибут [FromUri] в действии API.

Для получения дополнительной информации о привязке параметров просмотрите эту ссылку .

public class SomeData
{
    public int Start { get; set; } 
    public int End { get; set; }
}
public SomeController : ApiController
{
    public HttpResponseMessage Get([FromUri] SomeData data) { ... }
}

Клиентская сторона

Вам необходимо отправить ваши параметры в запросе как обычно.

http://localhost/api/Some?Start=0&End=10

Также еще один интересный ссылка для деталей здесь .

0 голосов
/ 17 января 2020

Я предпочитаю обрабатывать все остальные запросы с помощью RestSharp . Также это решит вашу проблему.

Как отметил журналист, у объекта будет мало свойств, чем это можно сделать следующим образом, не делая любые изменения в контроллере API.

var request = new RestRequest(url).AddParameter("paramName", "paramValue", ParameterType.GetOrPost);

, и вы можете получить результат по:

IRestResponse response = client.Execute(request);

Где client равен RestClient класс которая обрабатывает все ваши запросы / ответы.

0 голосов
/ 17 января 2020

Ваш объект что-то вроде этого? Итак, несколько свойств в списке или что-то в этом роде?

public class RootObject
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public object Attachment { get; set; }
}

Если это так, вы можете сериализовать его с помощью Json .Convert. После этого у вас будет строка, которую вы можете передать по вашему запросу. Что специфицирует c это объект. Это разрешение от asp mvc. Если это так, вам, скорее всего, понадобится OAuth accesstoken.

Надеюсь, это поможет

...