前面给大家分享过一篇文章:
上位机与MES交互最适合的方案是WebApi。
今天跟大家分享一下上位机如何学习WebApi,开发一个DeepSeek软件。
一、WebApi
首先我们要对WebApi有一些基本的认识:
1、WebApi是一种基于Http协议的应用程序编程接口,主要功能是让不同的应用通过网络进行数据交互。
2、WebApi基于Restful架构的API设计风格,通过Get、Post、Put、Delete实现资源操作,采用Json格式进行数据传输,相比较Xml来说更省流量。
3、WebApi支持异步编程模型(async方法),可以独立部署,也可以内置在Web或CS应用程序中。
4、WebApi是跨平台的,可以在任何平台上使用,不受限于特定的操作系统或编程语言。
5、WebApi支持自定义路由配置,支持跨域调用,支持OAuth、JWT实现认证授权。
二、免费API
上位机开发中,我们会通过WebApi来对接Mes等系统,但是学习时,没有Mes系统,我们该如何学习呢?
DeepSeek提供了API接口,我们可以通过C#代码编写一个软件,通过调用API接口来实现AI对话。
打开DeepSeek官网,右上方有个API开放平台,点击进入之后,可以看到DeepSeek API文档。
官方API是按tokens来收费的,但收费价格相对于ChatGPT来说已经很便宜了。如果不想收费,我们也可以通过一些第三方平台,比如腾讯云、阿里云、硅基流动、火山引擎等。一般注册后会提供一些免费的tokens供我们使用,对于学习来说,够用了。
三、火山方舟
推荐一个比较方便的大模型服务平台——火山方舟,火山方舟是火山引擎推出的大模型服务平台。官网地址:https://www.volcengine.com/experience/ark
点击进入之后,就可以AI对话了,里面有很多大模型,每个模型都赠送了50万tokens。
在AI对话框中,我们可以看到API接入的入口,点击之后即可快速API接入。
1、点击API接入之后,会打开一个窗口——快捷API接入,第一步先创建一个API Key,这个就是密钥,后面代码中会使用到。
2、第二步,我们就可以看到Rest API调用的一个示例了。
3、然后我们就可以使用API测试软件(Postman/Apifox)来进行测试,这里使用Apifox软件,我们创建一个新的接口,类型选择POST,将第二步中的url复制进去。
4、选择Auth,类型选择Bearer Token,将第一步中的API Key填进去。
5、选择Body,类型选择json或raw,将第二步中的content内容填进去,然后点击发送即可,等待一会之后,我们就看到返回信息了。
6、这样,我们就完成了WebApi接口的测试。在实际开发中,我们也是要先把接口测通之后,再去编写代码。
四、WebApi编写
接下来我们来编写代码,WebApi一般可以通过HttpClient或RustSharp库来实现。
1、我们先创建一个简单的窗体:
2、这里使用HttpClient编写一个调用DeepSeekApi的异步方法:
private string url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
//这里要填写自己的api key,下面的token是错误的
private string token = "89274ad1-3334-41fe-bd3b-7a64071d4c41";
private async Task<string> CallDeepSeekApiAsync(string question)
{
HttpClient httpClient = new HttpClient();
JObject body = new JObject();
body.Add("model", "deepseek-v3-250324");
JObject user1 = new JObject();
user1["role"] = "system";
user1["content"] = "你是一个人工智能助手";
JObject user2 = new JObject();
user2["role"] = "user";
user2["content"] = question;
body.Add("messages", new JArray() { user1, user2 });
//添加消息头
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var response = await httpClient.PostAsync(url, new StringContent(body.ToString()));
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return "ERROR:" + response.StatusCode;
}
}
3、然后在Send按钮事件方法中调用该方法即可,这里需要对返回的结果进行筛选,选择我们需要的content内容:
private async void btn_Send_Click(object sender, EventArgs e)
{
string question = this.txt_Question.Text.Trim();
var result = await CallDeepSeekApiAsync(question);
try
{
JObject obj = JObject.Parse(result);
this.rtb_Result.Text = obj["choices"][0]["message"]["content"].ToString();
this.lbl_token.Text = obj["usage"]["total_tokens"].ToString() + " tokens";
}
catch (Exception)
{
this.rtb_Result.Text = result;
}
}
4、运行程序,输入一个问题,点击Send即可,这里由于没有采用Stream流的方式,因此会比较耗时,需要等待一会,才会有结果:
5、我们还可以通过RestSharp库来实现,添加引用后,代码如下所示:
private async Task<string> CallDeepSeekApiRestAsync(string question)
{
var client = new RestClient(url);
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer "+token);
JObject body = new JObject();
body.Add("model", "deepseek-v3-250324");
JObject user1 = new JObject();
user1["role"] = "system";
user1["content"] = "你是一个人工智能助手";
JObject user2 = new JObject();
user2["role"] = "user";
user2["content"] = question;
body.Add("messages", new JArray() { user1, user2 });
request.AddParameter("text/plain", body, ParameterType.RequestBody);
var response =await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
return response.Content;
}
else
{
return "ERROR:" + response.StatusCode;
}
}
6、这样,我们就实现了上位机对DeepSeek API的调用过程。在实际开发中,不同的项目Mes提供的文档都会有所不同,但是思路都是一样的。