在开发者Q群里有人反映不会使用API方式调用不了NLP词法分析, 昨晚试了一下, API还是没有坏的^_^ 虚惊一场
因为C#是最好的语言, 所以给大家看一下C#的调用demo.
- 1. 画一个图形界面
- 2. 执行步骤
a. 使用两个Key换一个Token出来
b. 使用Token和输入的语句, 发个POST请求, 换回结果.
和大象进入冰箱有异曲同工之妙
- 3. 命名空间及引用
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Script.Serialization;
using System.Windows.Forms;
这里面使用了一个第三方的Newtonsoft.Json. 这个简直是神作. 可以去这里下载dll, 并且添加引用: https://www.newtonsoft.com/json
此外System.Web.Script这个在我的默认项目里面也没有, 需要手动添加.
4. 核心代码
a. 两个Key换一个Token
public class AccessToken
{
// 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
private String clientId = "";
// 百度云中开通对应服务应用的 Secret Key
private String clientSecret = "";
public AccessToken(string appkey, string secretkey)
{
this.clientId = appkey;
this.clientSecret = secretkey;
}
// 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
// 返回token示例
//public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";
public String getAccessToken()
{
//这段照抄应该就可以
String authHost = "https://aip.baidubce.com/oauth/2.0/token";
HttpClient client = new HttpClient();
List> paraList = new List>();
paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
//两个Key在这里传进去
paraList.Add(new KeyValuePair("client_id", clientId));
paraList.Add(new KeyValuePair("client_secret", clientSecret));
HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
String result = response.Content.ReadAsStringAsync().Result;
//WARNING: 这个result不是单纯的token, 而是一大堆东西, 需要解析
return result;
}
}
从result中解析出来真正需要的token (我放到了点击Get Token那个按钮的点击事件里面了, 其实放别的地方也可以
private void button1_Click(object sender, EventArgs e)
{
AccessToken accToken = new AccessToken(this.textBoxAppKey.Text, this.textBoxSecretKey.Text);
string returnedContent = accToken.getAccessToken();
//this result contains two parts (damned JSON file)
//we have to split it into two parts and remove unnecessary suffix like brackets
//Sample of return
//"{\"access_token\":\"24.39d622b051970e1813476d643f62cadb.2592000.1515943229.282335-10477809\",
//\"session_key\":\"9mzdCP1R5ugLlNT+jnWkhQDo78Lkn2O8x7j8XcrJ9gJTlfN7nxsY\\/F1WbTykpXZUZs8\\/mh1YRHl1dkQlNpL55fMwiQfebA==\",
//\"scope\":\"iknow-antispam_spamauth public nlp_simnet nlp_wordemb nlp_comtag nlp_dnnlm_cn brain_nlp_lexer brain_all_scope brain_nlp_comment_tag brain_nlp_dnnlm_cn brain_nlp_word_emb_vec brain_nlp_word_emb_sim brain_nlp_sentiment_classify brain_nlp_simnet brain_nlp_depparser brain_nlp_wordembedding brain_nlp_dnnlm_cn_legacy brain_nlp_simnet_legacy brain_nlp_comment_tag_legacy brain_nlp_lexer_custom wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\\u6743\\u9650 vis-classify_flower bnstest_fasf lpq_\\u5f00\\u653e\",
//\"refresh_token\":\"25.919a932d9db70b2b491050a8a2a1400b.315360000.1828711229.282335-10477809\",
//\"session_secret\":\"51b4dabe72d9569f817f8fed4d517d17\",\"expires_in\":2592000}\n"
Newtonsoft.Json.Linq.JObject obj = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(returnedContent);
this.token = obj["access_token"].ToString();
this.label1.Text = this.token;
}
b. 有了token就可以正式调用NLP API了
public class AccessAPI
{
public string GetResultViaAPI(string strToken, string sentence)
{
//这里使用Token
String apiHost = "https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?access_token=" + strToken;
Dictionary para = new Dictionary();
//这里是真正的输入区
para.Add("text", sentence);
//以下照抄
Encoding encoding = Encoding.GetEncoding("GBK");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiHost);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
JavaScriptSerializer json = new JavaScriptSerializer();
String str = json.Serialize(para);
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GBK"));
string result = reader.ReadToEnd();
return result;
}
}
最后来看一下运行效果:
好了, 就到这里~~~
请登录后评论
TOP
切换版块
产品经理也来共享了.嘿嘿
“无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。”
这个我在java里面见过 是winform程序和服务端 socket抛的异常~
您好,希望能向您请教个问题。我用C#运行官方示例时运行到下面这句代码时出现了错误:
request.GetRequestStream().Write(buffer, 0, buffer.Length);
System.IO.IOException:“无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。”
这个可能是什么问题导致的啊??
感谢,正为GBK苦恼呢
回头一起切磋代码~~
原来如此 幸会幸会 哈哈~
我是ai开放平台的产品经理. 其实不能算开发者, 且算是C#的粉丝吧~~
哈哈 go神不在孤单 c#会发扬光大
很高兴社区除了我还有C#开发者的出现。
欢迎使用C# SDK-CLI,全面接入NLP