powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Отправка POST запроса c сервера на сторонней сервер и получение ответа
6 сообщений из 6, страница 1 из 1
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40094412
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь!
Есть описание следующего API:
авторСтруктура запроса
Для получения данных об отсканированных талонах необходимо выполнить POST запрос со следующими параметрами (пример cURL):
curl --location --request POST 'https://xxxxx/app/api/barcodes/get.php' \
--header 'Application: remoteData' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=ваш_токен' \
--data-urlencode 'date=2021-08-18 10:00:00'

Адрес обращения: https://xxxxxx/app/api/barcodes/get.php
Обязательный заголовок: Application: remoteData
Поля запроса:
token – ваш уникальный идентификатор
date – дата и время, после которого будут собраны данные в формате YYYY-MM-DD HH:II:SS

Структура ответа сервера
При успешной обработке ответ сервера будет представлен в следующем виде:
{
"status": "OK",
"error": "",
"region": 76,
"date": "2021-08-11 10:00:00",
"items": {
"2": "2021-08-17 16:26:32",
"3": "2021-08-17 16:28:48",
"12": "2021-08-17 19:30:19"
}
}



Чтобы отправить запрос на этот сервис создал контроллер со следующими методами:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
[Route("api/[controller]")]
    [ApiController]
    [AllowAnonymous]
    //[Authorize(Roles = "admin, user")]
    public class QRcodeСheckAPIController : ControllerBase
    {
        private readonly HttpClient httpClient;
        private readonly IHttpClientFactory httpClientFactory;

        private readonly ILogger<QRcodeСheckAPIController> _logger;

        public QRcodeСheckAPIController(ILogger<QRcodeСheckAPIController> logger, IHttpClientFactory clientFactory)
        {
            _logger = logger;
            httpClientFactory = clientFactory;
            httpClient = new HttpClient();
        }

[HttpPost]
        [Route("requestqrcodesreceiving")]
        public async Task<IActionResult> RequestQRcodesReceiving([FromBody] string dateTimeStr)
        {
            string url = "https://xxxx/app/api/barcodes/get.php";
            string testurl = "http://localhost:18246//api/TestAPI/requestqrcodestest";
            ReportQrCodeExchange reportQrCodeExchange = new ReportQrCodeExchange();
            ResponseMessageDataQRCode responseData = null;
            string dateTimeNow = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");

            RequestMessageData requestMessage = new RequestMessageData
            {
                token = "N2U1OThkZDZkZDliZGFiM/lAfhoRNk0D+iJh2Z1h1fpYEUWXkzsbvGg1",
                date = dateTimeNow
            };

            try
            {
                string jsonRequest = JsonSerializer.Serialize(requestMessage);
                string jsonResponseData = await PostRequesHttpAsync(testurl, jsonRequest);
                responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCode>(jsonResponseData);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (responseData != null)
            {
                if (responseData.status.Equals("200") || responseData.status.Equals("OK"))
                {
                    reportQrCodeExchange = CheckQrCodes(responseData);
                }
                else
                {
                    reportQrCodeExchange.error = responseData.error;
                    reportQrCodeExchange.status = responseData.status;
                    return Ok(reportQrCodeExchange);
                }
            }

            return Ok(reportQrCodeExchange);
        }

        public async Task<string> PostRequesHttpAsync(string url, string json)
        {
            using HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
            httpClient.DefaultRequestHeaders.Add("Application", "remoteData");
            httpClient.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
            using HttpResponseMessage response = await httpClient.PostAsync(url, content).ConfigureAwait(false);

            return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        }

}



Для сериализации запроса и ответа создал два объекта:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class RequestMessageData
    {
        public string token { get; set; }
        public string date { get; set; }
    }

public class ResponseMessageDataQRCode
    {
        public string status { get; set; }
        public string error { get; set; }
        public int region { get; set; }
        public string date { get; set; }
        public Items [] items { get; set; }

    }

public class Items
    {
        public string name { get; set; }
        public string dateTime { get; set; }
    }        



Проблема в том, что с этой строки
Код: c#
1.
string jsonResponseData = await PostRequesHttpAsync(testurl, jsonRequest);

постоянно выкидывает в
Код: c#
1.
catch (Exception ex)

, при этом "ex" ==mull, значение
строка
Код: c#
1.
responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCode>(jsonResponseData);

пропускается, а
jsonResponseData ==null

Пробовал создавал в этом же приложение контроллер и отправлять на его адрес запрос - получаю исключение
авторНеправильно использованное имя заголовка. Убедитесь, что заголовки запроса используются с HttpRequestMessage, заголовки ответов с HttpResponseMessage и заголовки содержимого с объектами HttpContent ».:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        [HttpPost]
        [Route("requestqrcodestest")]
        public async Task<IActionResult> RequestQRcodesTest([FromBody] RequestMessageData requestMessageData)
        {
            ResponseMessageDataQRCode responseMessageDataQRCode = new ResponseMessageDataQRCode();

            responseMessageDataQRCode.date = requestMessageData.date;
            responseMessageDataQRCode.error = "";
            responseMessageDataQRCode.region = 56;
            responseMessageDataQRCode.status = "200";
            responseMessageDataQRCode.items.Append(new Items
            {
                dateTime = requestMessageData.date,
                name = "TestQRcode"
            });

            return Ok(responseMessageDataQRCode);
        }
    }
...
Рейтинг: 0 / 0
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40094418
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad__i__mir, Везде выдает исключение:
авторex.Message "Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects."
...
Рейтинг: 0 / 0
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40094443
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема вроде бы разрешилась следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public async Task<string> PostRequesHttpAsync(string url, string json)
        {
            using HttpContent content = new StringContent(json, Encoding.UTF8, "application/x-www-form-urlencoded");
            httpClient.DefaultRequestHeaders.Add("Application", "remoteData");
            //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
            using HttpResponseMessage response = await httpClient.PostAsync(url, content).ConfigureAwait(false);

            return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        }
...
Рейтинг: 0 / 0
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40094689
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,

забавно.
а с какой целью вы инжектите IHttpClientFactory а потом создаете HttpClient не используя фабрику?
...
Рейтинг: 0 / 0
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40097933
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
winsky!
Vlad__i__mir,

забавно.
а с какой целью вы инжектите IHttpClientFactory а потом создаете HttpClient не используя фабрику?


Просто сперва результат гугления выдал IHttpClientFactory, а потом понял, что для моей задачи можно использовать более простой инструмент
...
Рейтинг: 0 / 0
Отправка POST запроса c сервера на сторонней сервер и получение ответа
    #40100137
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,

вы вот это поломали
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Отправка POST запроса c сервера на сторонней сервер и получение ответа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]