Introduction détaillée à l'exemple de partage de code de requêtes réseau sous le noyau C# .net

黄舟
Libérer: 2017-05-28 10:05:07
original
1525 Les gens l'ont consulté

Cet article présente principalement l'explication détaillée des requêtes réseau c# sous .net core. Il présente brièvement comment effectuer des requêtes http sous .net core. Les principales méthodes sont toujours GET et POST. intéressé, vous pouvez comprendre

Cet article est dans l'environnement VS2017, .net core version 1.1 ou supérieur.

Pendant cette période, étant donné que le noyau .net n'est pas basé sur IIS, notre ancien code de requête réseau peut être incompatible et un rapport d'erreurs sous le noyau .netframework. Voici une introduction générale sur la façon de faire des requêtes http sous .net core. Les principales méthodes sont toujours GET et POST. S'il y a des erreurs, corrigez-moi !

Parlons d'abord du POST. J'ai implémenté trois méthodes pour le POST. Les deux premières sont basées sur les mêmes principes. Il y a quelques petites différences dans les dernières, mais leur essence est la requête http. Il n’y a aucune différence, seule la méthode de mise en œuvre est différente.

Sans plus attendre, voici le code :

Méthode asynchrone POST :

 /// <summary>
    /// 异步请求post(键值对形式,可等待的)
    /// </summary>
    /// <param name="uri">网络基址("http://localhost:59315")</param>
    /// <param name="url">网络的地址("/api/UMeng")</param>
    /// <param name="formData">键值对List<KeyValuePair<string, string>> formData = new List<KeyValuePair<string, string>>();formData.Add(new KeyValuePair<string, string>("userid", "29122"));formData.Add(new KeyValuePair<string, string>("umengids", "29122"));</param>
    /// <param name="charset">编码格式</param>
    /// <param name="mediaType">头媒体类型</param>
    /// <returns></returns>
    public async Task<string> HttpPostAsync(string uri, string url, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
    {
      
      string tokenUri = url;
      var client = new HttpClient();
      client.BaseAddress = new Uri(uri);
      HttpContent content = new FormUrlEncodedContent(formData);
      content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
      content.Headers.ContentType.CharSet = charset;
      for (int i = 0; i < formData.Count; i++)
      {
        content.Headers.Add(formData[i].Key, formData[i].Value);
      }
      
      HttpResponseMessage resp = await client.PostAsync(tokenUri, content);
      resp.EnsureSuccessStatusCode();
      string token = await resp.Content.ReadAsStringAsync();
      return token;
    }
Copier après la connexion

Méthode synchrone POST :

/// <summary>
    /// 同步请求post(键值对形式)
    /// </summary>
    /// <param name="uri">网络基址("http://localhost:59315")</param>
    /// <param name="url">网络的地址("/api/UMeng")</param>
    /// <param name="formData">键值对List<KeyValuePair<string, string>> formData = new List<KeyValuePair<string, string>>();formData.Add(new KeyValuePair<string, string>("userid", "29122"));formData.Add(new KeyValuePair<string, string>("umengids", "29122"));</param>
    /// <param name="charset">编码格式</param>
    /// <param name="mediaType">头媒体类型</param>
    /// <returns></returns>
    public string HttpPost(string uri, string url, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
    {      
      string tokenUri = url;
      var client = new HttpClient();
      client.BaseAddress = new Uri(uri);
      HttpContent content = new FormUrlEncodedContent(formData);
      content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
      content.Headers.ContentType.CharSet = charset;
      for (int i = 0; i < formData.Count; i++)
      {
        content.Headers.Add(formData[i].Key, formData[i].Value);
      }

      var res = client.PostAsync(tokenUri, content);
      res.Wait();
      HttpResponseMessage resp = res.Result;
      
      var res2 = resp.Content.ReadAsStringAsync();
      res2.Wait();

      string token = res2.Result;
      return token;
    }
Copier après la connexion

Malheureusement, la méthode synchrone est également basée sur une implémentation asynchrone. Je pense personnellement que cela augmentera la surcharge du système. Si vous avez d'autres implémentations efficaces, n'hésitez pas à me le faire savoir !

L'étape suivante consiste à effectuer le POST via le flux :

public string Post(string url, string data, Encoding encoding, int type)
    {
      try
      {
        HttpWebRequest req = WebRequest.CreateHttp(new Uri(url));
        if (type == 1)
        {
          req.ContentType = "application/json;charset=utf-8";
        }
        else if (type == 2)
        {
          req.ContentType = "application/xml;charset=utf-8";
        }
        else
        {
          req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
        }

        req.Method = "POST";
        //req.Accept = "text/xml,text/javascript";
        req.ContinueTimeout = 60000;

        byte[] postData = encoding.GetBytes(data);
        Stream reqStream = req.GetRequestStreamAsync().Result;
        reqStream.Write(postData, 0, postData.Length);
        reqStream.Dispose();

        var rsp = (HttpWebResponse)req.GetResponseAsync().Result;
        var result = GetResponseAsString(rsp, encoding);
        return result;
        
      }
      catch (Exception ex)
      {
        throw;
      }
    }
Copier après la connexion
private string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
    {
      Stream stream = null;
      StreamReader reader = null;

      try
      {
        // 以字符流的方式读取HTTP响应
        stream = rsp.GetResponseStream();
        reader = new StreamReader(stream, encoding);
        return reader.ReadToEnd();
      }
      finally
      {
        // 释放资源
        if (reader != null) reader.Dispose();
        if (stream != null) stream.Dispose();
        if (rsp != null) rsp.Dispose();
      }
    }
Copier après la connexion

Cette méthode de POST écrit toujours les données dans le flux et exécute le POST. 2. La forme clé-valeur doit être conforme au style de Java ou OC dans la webapi écrite en C#, puisque la forme de réception est {=value} au lieu de {key=value} (déterminée par la nature de la webapi), Je dirai plus tard Comment recevoir le formulaire (valeur clé) dans webapi et éviter de manière appropriée les conflits entre le personnel backend .net et Android et iOS, afin d'atteindre la paix et la stabilité à long terme dans une démocratie socialiste société.

Ensuite, c'est get. De même, synchrone et asynchrone sont tous implémentés par asynchrone, alors veuillez le lire à la légère.

OBTENIR :

 /// <summary>
    /// 异步请求get(UTF-8)
    /// </summary>
    /// <param name="url">链接地址</param>    
    /// <param name="formData">写在header中的内容</param>
    /// <returns></returns>
    public static async Task<string> HttpGetAsync(string url, List<KeyValuePair<string, string>> formData = null)
    {
      HttpClient httpClient = new HttpClient();
      HttpContent content = new FormUrlEncodedContent(formData);
      if (formData != null)
      {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
        content.Headers.ContentType.CharSet = "UTF-8";
        for (int i = 0; i < formData.Count; i++)
        {
          content.Headers.Add(formData[i].Key, formData[i].Value);
        }
      }
      var request = new HttpRequestMessage()
      {
        RequestUri = new Uri(url),
        Method = HttpMethod.Get,
      };
      for (int i = 0; i < formData.Count; i++)
      {
        request.Headers.Add(formData[i].Key, formData[i].Value);
      }
      var resp = await httpClient.SendAsync(request);
      resp.EnsureSuccessStatusCode();
      string token = await resp.Content.ReadAsStringAsync();

      return token;
    }
Copier après la connexion
 /// <summary>
    /// 同步get请求
    /// </summary>
    /// <param name="url">链接地址</param>    
    /// <param name="formData">写在header中的键值对</param>
    /// <returns></returns>
    public string HttpGet(string url, List<KeyValuePair<string, string>> formData = null)
    {
      HttpClient httpClient = new HttpClient();
      HttpContent content = new FormUrlEncodedContent(formData);
      if (formData != null)
      {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
        content.Headers.ContentType.CharSet = "UTF-8";
        for (int i = 0; i < formData.Count; i++)
        {
          content.Headers.Add(formData[i].Key, formData[i].Value);
        }
      }
      var request = new HttpRequestMessage()
      {
        RequestUri = new Uri(url),
        Method = HttpMethod.Get,
      };
      for (int i = 0; i < formData.Count; i++)
      {
        request.Headers.Add(formData[i].Key, formData[i].Value);
      }
      var res = httpClient.SendAsync(request);
      res.Wait();
      var resp = res.Result;
      Task<string> temp = resp.Content.ReadAsStringAsync();
      temp.Wait();
      return temp.Result;
    }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!