Member 10192073 Ответов: 3

Как сделать метод post и вызвать его из моего настольного приложения


привет,
Мне нужно реализовать синхронизацию элементов учета в облаке, поэтому у меня уже есть методы WCF для синхронизации, но я хочу, чтобы веб-API публиковал данные json, а затем хранил их в веб-БД.

как и ранее, мы сделали метод get для android-приложения и возвращаем данные в формате json.

[AcceptVerbs("Get")]
        public DataTable Inflow(long TenantId, long SalesPersonId)
        {
            DataTable dtReceivable = new DataTable();
return dtReceivable 
}


для этого android разработчик называл этот url как

MyURL/api/MobileAPI/приток?TenantId=1234& SalesPersonId=22
а затем получение данных в формате json

Теперь я хочу создать метод Post для синхронизации с веб-базой данных.
string JsonString = Inventory();


Мне нужно пройти этот JSON строку с клиента.
Я хочу опубликовать это через свой URL-адрес, например
using (HttpClient httpclient = new HttpClient())
                        {
string url = "http://localhost:51411/api/MobileAPI/Inventory?TenantId=" + CommonClass.tenantId + "";
                            String uriToCall = String.Format(url);
                            var content = new FormUrlEncodedContent(new[]
                            {
                            new KeyValuePair<string, string>("", str)
                            });
}

Я не понимаю, с чего начать, так что, пожалуйста, кто-нибудь может мне помочь.

Что я уже пробовал:

Я попробовал это сделать, прочитав несколько статей в google, но все равно это не очень хорошо....
string str = Inventory();
    //HttpClient http = new HttpClient();
    using (HttpClient httpclient = new HttpClient())
    {


        var http = (HttpWebRequest)WebRequest.Create(new Uri("http://localhost:51411/api/MobileAPI/Inventory?TenantId='" + CommonClass.tenantId + "'&JsonInventory='" + str));
        http.Accept = "application/json";
        http.ContentType = "application/json";
        http.Method = "POST";
    }


и мой код веб-API
[HttpPost]
       [AcceptVerbs("POST")]
       public HttpResponseMessage Inventory(long TanantId, [FromBody]string JsonInventory)
       {
           try
           {
               List<Inventory> lstInventory = JsonConvert.DeserializeObject<List<Inventory>>(JsonInventory);
               foreach (var item in lstInventory)
               {

               }
               return new HttpResponseMessage(HttpStatusCode.OK);
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }


Моя инвентарная модель такова

public class Inventory
    {
        public string ItemId { get; set; }
        public string Category { get; set; }
        public decimal Price1 { get; set; }
        public string Description { get; set; }
        public int QuantityAvailable { get; set; }
        public int QuantityOnHand { get; set; }
        public string Method { get; set; }
    }


я беспокоюсь, чтобы вызвать этот url-адрес из оконного приложения, даже если мое веб-приложение также находится в рабочем режиме.

3 Ответов

Рейтинг:
9

Member 10192073

Спасибо за ваше решение, но я решил it....my код есть

string str = Inventory();
                        using (WebClient httpclient = new WebClient())
                        {
                            //string str = "abc";
                            string url = "http://localhost:51411/api/MobileAPI/Inventory?TenantId=" + CommonClass.tenantId;

                            ASCIIEncoding encoding = new ASCIIEncoding();
                            byte[] data = encoding.GetBytes(str);

                            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                            request.Method = "Post";
                            request.ContentLength = data.Length;
                            request.ContentType = "application/json";

                            using (Stream stream = request.GetRequestStream())
                            {
                                stream.Write(data, 0, data.Length);
                            }

                            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                        }


и мой код веб-API, как это

[HttpPost]
       [AcceptVerbs("POST")]
       async public Task Inventory(long TenantId)
       {
           try
           {
               byte[] data = await Request.Content.ReadAsByteArrayAsync();
               string JsonInventory = System.Text.Encoding.Default.GetString(data);
               List<Inventory> lstInventory = JsonConvert.DeserializeObject<List<Inventory>>(JsonInventory);
               foreach (var item in lstInventory)
               {

               }

           }
           catch (Exception ex)
           {
               throw ex;
           }
       }


public class Inventory
   {
       public string ItemId { get; set; }
       public string Category { get; set; }
       public decimal Price1 { get; set; }
       public string Description { get; set; }
       public int QuantityAvailable { get; set; }
       public int QuantityOnHand { get; set; }
       public string Method { get; set; }
   }


Рейтинг:
1

Richard Deeming

Ты уже близко! :)

HttpClient http = new HttpClient();
string url = "http://localhost:51411/api/MobileAPI/Inventory?TenantId=" + CommonClass.tenantId;
StringContent content = new StringContent(JsonString, null, "application/json");
HttpResponseMessage response = await http.PostAsync(url, content);
response.EnsureSuccessStatusCode();

NB: То HttpClient класс не должен быть завернут в using блок:
Вы неправильно используете HttpClient и это дестабилизирует ваше программное обеспечение | ASP.NET монстры[^]


catch (Exception ex)
{
    throw ex;
}

Не делай этого! Вы только что уничтожили трассировку стека, что сделает невозможным отследить источник ошибки.

Если вам действительно нужно повторно создать исключение, не оборачивая его в новое исключение, просто используйте throw; без этого ex:
catch (Exception ex)
{
    // Do something with the exception here...
    throw;
}

Но в этом случае, поскольку вы ничего не делаете с исключением, просто удалите try..catch блок.


Рейтинг:
0

cjmakwana

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

1. Использовать NuGet-пакет коробки, например RestSharp. Это позволяет вызывать любой HTTP-запрос с помощью глаголов, поддерживаемых в соответствии со спецификациями HTTP 1.1. В библиотеке есть классы RestClient и RestRequest. Пожалуйста, обратитесь к документации по адресу RestSharp - простой REST и HTTP-клиент для .NET[^].

2. Использовать встроенный .Типы сетевых фреймворков, такие как WebClient или HttpWebRequest. Решение, предложенное Ричардом здесь, является именно тем, которое использует WebClient.

Кроме того, я отметил, что в коде Web API (server) вы используете сериализованную строку в качестве параметра из body - JsonInventory. Однако вы можете использовать тип инвентаря непосредственно здесь, и нет необходимости явно десериализовывать его с помощью Newtonsoft.Библиотека Json. На самом деле, ASP.NET веб-API заботится об этом.