>  기사  >  백엔드 개발  >  .net 코어에서 http 요청을 만드는 방법은 무엇입니까?

.net 코어에서 http 요청을 만드는 방법은 무엇입니까?

零下一度
零下一度원래의
2017-05-26 13:36:218830검색

이 글에서는 주로 C# .net core에서의 네트워크 요청에 대한 자세한 설명을 소개합니다. .net core에서 http 요청을 만드는 방법은 여전히 ​​GET과 POST입니다.

본 글은 VS2017, .net Core 버전 1.1 이상 환경에서 작성되었습니다.

이 기간 동안 .net 코어는 IIS를 기반으로 하지 않기 때문에 과거 네트워크 요청 코드가 호환되지 않을 수 있으며 .net 코어 프레임워크에서 오류가 보고될 수 있습니다. 다음은 .net 코어에서 http 요청을 만드는 방법에 대한 일반적인 소개입니다. 여전히 주요 방법은 GET 및 POST입니다. 오류가 있으면 수정해 주세요.

먼저 POST에 대해 이야기하겠습니다. 처음 두 가지 방법은 동일한 원칙을 기반으로 하지만 그 본질은 http 요청입니다. 차이점은 없으며 구현 방법이 다릅니다.

더 이상 고민하지 말고 코드는 다음과 같습니다.

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;
    }

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;
    }

아쉽게도 동기식 방식도 비동기식 구현에 기반을 두고 있기 때문에 그렇게 하면 시스템 오버헤드가 늘어날 것이라고 개인적으로 생각합니다. 다른 효율적인 구현 방법이 있으면 언제든지 알려주시기 바랍니다!

다음 단계는 스트림을 통한 POST입니다.

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;
      }
    }
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();
      }
    }

이 POST 메서드는 여전히 스트림에 데이터를 쓰고 POST를 수행합니다. 작성된 양식은 Java 또는 OC의 스타일을 따르도록 되어 있습니다. C#으로 작성된 webapi에서는 수신 양식이 {key=value}가 아닌 (webapi의 특성에 따라 결정됨) {=value}이기 때문입니다. 나중에 webapi로 받는 방법에 대해 이야기하고, .net 백엔드 인력과 android 및 ios 간의 충돌을 적절하게 방지하여 사회주의 민주 사회의 장기적인 평화와 안정을 달성합니다. .

다음은 get입니다. 마찬가지로 동기, 비동기 모두 비동기로 구현되오니 가볍게 읽어보시기 바랍니다.

받기:

 /// <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;
    }
rrree

[관련 추천]

1. .Net Core 그래픽 인증 코드

2. .NET Core 구성 파일 로드 및 구성 데이터의 DI 삽입

3. .NET Core CLI 도구 문서 dotnet-publish

4. .Net Core용 ZKEACMS 자세히 소개

5. .net MVC에서 양식 확인을 사용하는 예제 코드 공유

6. CentOS에서 ZKEACMS를 실행하기 위한 예제 튜토리얼

위 내용은 .net 코어에서 http 요청을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.