Как я могу отправить запрос GET с телом json? - PullRequest
0 голосов
/ 03 апреля 2020

Можно ли вообще как-нибудь отправить запрос GET с телом JSON, используя c#? Я звоню в API для получения списка элементов, используя запрос GET, но мне нужно передать customer_id в JSON. Я могу сделать это успешно в Почтальоне и Python. Однако устаревшее приложение, с которым я работаю, имеет вид c#. NET winform. Я могу совершать другие вызовы, используя HttpClient, но после некоторых исследований я обнаружил, что этот класс не допускает GET-запрос с телом, за исключением случаев использования CORE. Есть ли другие альтернативы?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Согласно ответу Иана Кемпа на этот вопрос , это можно сделать в. NET Каркасных проектах с использованием System. Net .Http.WinHttpHandler Библиотека. ( Я просто добавлю соответствующую часть ответа здесь, но я рекомендую go проверить его полный ответ )

Сначала установите System. Net .Http.WinHttpHandler Библиотека из Nuget, а затем используйте ее в качестве обработчика http-клиента, как описано ниже:

var handler = new WinHttpHandler();
var client = new HttpClient(handler);
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("some url"),
    Content = new StringContent("some json", Encoding.UTF8, ContentType.Json),
};

var response = await client.SendAsync(request).ConfigureAwait(false);
//Handle the response as you see fit
0 голосов
/ 03 апреля 2020

С помощью HTTP-метода GET тело не имеет смысла. Он будет игнорироваться в соответствии со спецификациями HTTP. При получении ресурсов из вашего API с помощью глагола http GET у вас есть возможность передать строку запроса (http://somedomain.com/api/getValues?key=1) или передать параметр непосредственно в URL (http://somedomain.com/api/getValues/1) )

Чтобы получить его в вашем контроллере, вы должны ожидать либо параметр, либо строку запроса, например:

Если параметр находится в URL:

[HttpGet("/api/getValues/{id}")]
public async Task<IActionResult> GetValues(int id){}

(Убедитесь, что имя вашего параметра в функции совпадает с именем, которое вы дали ему в маршруте)

Если параметр является строкой запроса:

[HttpGet("/api/getValues")]
public async Task<IActionResult> GetValues(string key){}

(Убедитесь, что что имя ключа строки запроса соответствует имени параметра в вашей функции)

Рекомендуется использовать параметр в URL-адресе. Строки запроса очень полезны, но вы должны знать, когда их использовать, например, если вы хотите сузить результаты по определенным значениям, вы можете запросить их в строке запроса.

...