C#使用Post调用接口并传递json参数原创
金蝶云社区-迷路的绵羊
迷路的绵羊
3人赞赏了该文章 377次浏览 未经作者许可,禁止转载编辑于2024年01月06日 15:24:49

1. 确定请求地址和请求方式

使用Post调用接口需要确定请求地址和请求方式。通常情况下,请求地址是指接口的URL,请求方式是指HTTP请求的方式,即"GET"或"POST"。

2. 导入必要的命名空间

在进行Post调用接口时,需要导入以下两个命名空间:

using System.Net;
using System.IO;

这两个命名空间分别提供了Web请求和读写流的功能。

3. 创建HttpWebRequest对象

创建一个HttpWebRequest对象,用于发出Post请求。

string url = "https://www.example.com/api/test";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";

上面的代码中,url是接口的URL,request是一个HttpWebRequest对象,使用的是Post方式。

4. 设置请求头信息

设置请求头信息可以帮助接口方更好地理解请求,从而提高接口的安全性和可维护性。通常,请求头信息包括Content-Type和Accept等字段。

request.ContentType = "application/json";
request.Accept = "application/json";

设置Content-Type为"application/json",表示请求发送的数据格式为Json,设置Accept为"application/json",表示接受的响应数据格式为Json。

5. 设置请求参数

设置请求参数需要将数据以Json格式序列化,然后将数据写入请求流中。

string data = "{\"key\":\"value\"}";
byte[] byteData = Encoding.UTF8.GetBytes(data);
request.ContentLength = byteData.Length;
using (Stream requestBody = request.GetRequestStream())
{
    requestBody.Write(byteData, 0, byteData.Length);
}

上面的代码中,data是一个Json格式的字符串,将其序列化为字节数组byteData,然后将字节数组写入请求流requestBody中,最后设置请求内容的长度。

6. 发送Post请求并获取响应

发送Post请求需要调用GetResponse方法,获取响应需要读取响应流,将响应内容读出并反序列化为Json格式。

using (WebResponse response = request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8))
        {
            string responseData = streamReader.ReadToEnd();
            YourModel model = JsonConvert.DeserializeObject<YourModel>(responseData);
        }
    }
}

上面的代码中,response是接收的响应对象,responseStream是响应流,streamReader是响应流的读取器,读取出的响应数据responseData为一个Json格式的字符串,使用JsonConvert.DeserializeObject方法将其反序列化为YourModel类型的对象model。

示例一

下面是一个使用Post方式调用掘金API的示例:

using System.Net;
using System.IO;
using Newtonsoft.Json;

namespace TestPostInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://api.juejin.cn/content_api/v1/article/detail?aid=6809267625271704071";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.Accept = "application/json";
            string data = "{\"aid\":\"6809267625271704071\"}";
            byte[] byteData = Encoding.UTF8.GetBytes(data);
            request.ContentLength = byteData.Length;
            using (Stream requestBody = request.GetRequestStream())
            {
                requestBody.Write(byteData, 0, byteData.Length);
            }
            using (WebResponse response = request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8))
                    {
                        string responseData = streamReader.ReadToEnd();
                        JuejinArticleDto articleDto = JsonConvert.DeserializeObject<JuejinArticleDto>(responseData);
                        Console.WriteLine($"文章标题:{articleDto.Data.Title}");
                    }
                }
            }
            Console.ReadKey();
        }
    }

    public class JuejinArticleDto
    {
        public int ErrNo { get; set; }
        public DataDto Data { get; set; }
    }

    public class DataDto
    {
        public string Content { get; set; }
        public string Title { get; set; }
        //...
    }
}

上面的代码中,我们使用Post方式发起了一个掘金API的请求,获取到了一篇文章的标题信息并输出。

示例二

下面是一个使用Post方式调用高德地图API的示例:

using System;
using System.Net;
using System.IO;
using Newtonsoft.Json;

namespace TestPostInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://restapi.amap.com/v3/geocode/regeo?key=[your_key]&location=116.481488,39.990464&poitype=&radius=1000&extensions=all&batch=false&roadlevel=0";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.Accept = "application/json";
            using (WebResponse response = request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader streamReader = new StreamReader(responseStream, System.Text.Encoding.UTF8))
                    {
                        string responseData = streamReader.ReadToEnd();
                        AmapRegeoDto regeoDto = JsonConvert.DeserializeObject<AmapRegeoDto>(responseData);
                        Console.WriteLine($"经纬度:{regeoDto.Regeocode.FormattedAddress}");
                    }
                }
            }
            Console.ReadKey();
        }
    }

    public class AmapRegeoDto
    {
        public RegeocodeDto Regeocode { get; set; }
    }

    public class RegeocodeDto
    {
        public string FormattedAddress { get; set; }
        //...
    }
}

上面的代码中,我们使用Post调用了高德地图API,获取到了一组地理坐标的逆地理编码信息,并输出了其地址信息。

希望这些示例能够帮助你更好地理解如何使用C#进行Post调用接口并传递json参数。


赞 3