Discuz!NT

首页 » Discuz!NT开发与测试 » API应用开发 » Discuz!NT API使用指南(更新至5月14日)
doopcl - 2009/4/15 10:14:00
1.什么是Discuz!NT API?Uæg.5’“=nt.discuz.netêš)áå—ì
    Discuz!NT API是Discuz!NT发布的REST式web service,支持任何web技术系统和Discuz!NT进行跨域的整合。利用API可以在整合程序中调用用户资料,版块,帖子等内容,来开发跟论坛高度整合的应用程序。Uæg.5’“=nt.discuz.netêš)áå—ì
  Uæg.5’“=nt.discuz.netêš)áå—ì
  15499Uæg.5’“=nt.discuz.netêš)áå—ì
  
Uæg.5’“=nt.discuz.netêš)áå—ì

如图所示,Discuz!NT Server是运行着Discuz!NT的服务器。而App Server则是运行着App(应用程序)的客户端。Uæg.5’“=nt.discuz.netêš)áå—ì

Uæg.5’“=nt.discuz.netêš)áå—ì
用户访问某个App时,Discuz!NT Server会发送一些必要的参数给AppServer,以供App确认当前访问App的用户来自于合法的Discuz!NT Server站点。Uæg.5’“=nt.discuz.netêš)áå—ì
在App运行时,如果需要从服务器端获取信息(例如判断当前登录用户的id),首先要向服务器端发送一个请求;服务器端接收到请求后,判断该请求是否合法(是否是由经过授权的App发送的,参数是否正确并完整等等)。如果请求合法,则服务器端调用对应的方法,并将执行结果返回给客户端。Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
     Discuz!NT API返回信息有XML和JSON两种Uæg.5’“=nt.discuz.netêš)áå—ì
     XML返回示例:Uæg.5’“=nt.discuz.netêš)áå—ì
<?xml version="1.0" encoding="utf-8"?>Uæg.5’“=nt.discuz.netêš)áå—ì
<users_getInfo_response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" list="true" xmlns="http://nt.discuz.net/api/">Uæg.5’“=nt.discuz.netêš)áå—ì
  <user>Uæg.5’“=nt.discuz.netêš)áå—ì
    <user_name>admin</user_name>Uæg.5’“=nt.discuz.netêš)áå—ì
    <nick_name>测试管理员</nick_name>Uæg.5’“=nt.discuz.netêš)áå—ì
  </user>Uæg.5’“=nt.discuz.netêš)áå—ì
</users_getInfo_response>Uæg.5’“=nt.discuz.netêš)áå—ì
JSON返回实例:Uæg.5’“=nt.discuz.netêš)áå—ì
[{"user_name":"admin","nick_name":"测试管理员"}]Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
2.我们要先做什么样的部署才可以使用它?Uæg.5’“=nt.discuz.netêš)áå—ì
   因为使用一个Discuz!NT站点的API是需要Discuz!NT站点进行身份验证的,为了站点的信息安全,我们必须先在Discuz!NT站点的后台--扩展--通行证设置 中去添加整合程序设置,添加后站点将生成APIKEY和secret_key供整合程序使用。Uæg.5’“=nt.discuz.netêš)áå—ì
15427Uæg.5’“=nt.discuz.netêš)áå—ì
3.Sessionkey是如何获取到的,以及Sessionkey和AuthToken的关系。Uæg.5’“=nt.discuz.netêš)áå—ì
    因为之前有很多网友对这个环节有很多的疑问,所以这次先解释这个问题。Uæg.5’“=nt.discuz.netêš)áå—ì
    虽然有些API调用并不需要整合程序提供正确的Sessionkey,但是涉及到了用户密码修改等涉及信息安全系数较高的操作,系统会要求整合程序提供Sessionkey。Uæg.5’“=nt.discuz.netêš)áå—ì
    在官方提供的API方法中,auth.getSession 方法是返回Sessionkey的,但是这里就需要用户在使用它时提供AuthToken,AuthToken是通过请求 http://你的论坛地址/login.aspx?api_key=整合程序的API_KEY  获得的,如果当前状态为用户已登录,则会通过Callback(此信息在添加整合程序中需要填写,为返回信息给整合程序的某个页面)里面的地址返回AuthToken,否则则需要登录,登录后同样会返回AuthToken。Uæg.5’“=nt.discuz.netêš)áå—ì
    所以说正确获取Sessionkey的步骤为:登录--获取AuthToken--调用auth.getSession --获取SessionkeyUæg.5’“=nt.discuz.netêš)áå—ì
想知道更多关于API的使用,请点击Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
4.一个API的调用示例。Uæg.5’“=nt.discuz.netêš)áå—ì
http://localhost/services/restserver.aspxUæg.5’“=nt.discuz.netêš)áå—ì
sig=d5f3507f828c1c6c101c82d777861311&api_key=81e86044e429674c229187005ae66e46Uæg.5’“=nt.discuz.netêš)áå—ì
&fields=user_name,nick_name&method=users.getInfo&uids=1Uæg.5’“=nt.discuz.netêš)áå—ì
这个环节要注意的是sig的生成。Uæg.5’“=nt.discuz.netêš)áå—ì
    sig是由以下字串经由MD5加密后生成Uæg.5’“=nt.discuz.netêš)áå—ì
api_key=81e86044e429674c229187005ae66e46fields=user_name,nick_namemethod=users.getInfouids=Uæg.5’“=nt.discuz.netêš)áå—ì
1f974283986424571dc6a67f83fd0c3faUæg.5’“=nt.discuz.netêš)áå—ì
该字串生成规则为,key1=value1key2=value2key3=value3secret_key,并且参数名需按首字母顺序排列,大家可以仔细看下上面的字串Uæg.5’“=nt.discuz.netêš)áå—ì
使用Discuztoolkit整合的同志们注意了,如果有使用toolkit出现xml(x,x)错误,不能正常返回数据的。请检查设置的dnt论坛地址Uæg.5’“=nt.discuz.netêš)áå—ì
比如将dnt论坛地址设置 http://nt.discuz.net  是不对的。Uæg.5’“=nt.discuz.netêš)áå—ì
正确的dnt论坛地址是应该设置为http://nt.discuz.net/ 后面有一道斜杠Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
想知道更多API方法,请点击Uæg.5’“=nt.discuz.netêš)áå—ì
lanyur - 2009/4/16 15:34:00
sig倒底怎么生成的,给个例子。Uæg.5’“=nt.discuz.netêš)áå—ì
lanyur - 2009/4/16 15:37:00
看明白了。跟支付宝的API的差不多。签名是将那一串MD5,同时是没有&符号的。Uæg.5’“=nt.discuz.netêš)áå—ì
hubaolin - 2009/4/16 16:54:00
希望出个 视频教程啊  已看就明白~~Uæg.5’“=nt.discuz.netêš)áå—ì
lanyur - 2009/4/16 17:04:00
签证签名的时候,将传的key进行了一次排序,所以访问的时候参数的位置不能弄错了,否则会签名错误。Uæg.5’“=nt.discuz.netêš)áå—ì
lunfg - 2009/4/16 22:32:00
未能从程序集“Discuz.Toolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“Discuz.Toolkit.DiscuzSession”,因为方法“get_Util”没有实现(没有 RVA)。Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/4/17 9:23:00
你能将你的情况介绍的具体一点么,使用API前期的部署有没有都做好。Uæg.5’“=nt.discuz.netêš)áå—ì
lonky - 2009/4/19 23:52:00
:_onion2:Uæg.5’“=nt.discuz.netêš)áå—ì
hjlast - 2009/4/24 15:12:00
我用的是ASP的程序,只做了简单的用户注册登录整合 呵呵 还没用得上API              我的小站580家居社区Uæg.5’“=nt.discuz.netêš)áå—ì
zhaoguoping - 2009/5/7 14:10:00
:_onion1:Uæg.5’“=nt.discuz.netêš)áå—ì
大闸蟹 - 2009/5/7 16:19:00
建议做成PDF格式的,供大家下载Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/5/21 11:37:00
呵呵,目前该指南还不完善,所以还没有做成可下载的文档。Uæg.5’“=nt.discuz.netêš)áå—ì
jasonf430 - 2009/6/2 16:10:00
我在自己的站点上调用API登录论坛Uæg.5’“=nt.discuz.netêš)áå—ì
  string api_key = "ed3cb8fafbc201384d40776bc419220e";Uæg.5’“=nt.discuz.netêš)áå—ì
        string secret = "aa86a60af2fdf0b7b7c58a972e5c8d53";Uæg.5’“=nt.discuz.netêš)áå—ì
        string url = "http://localhost:85/";//论坛URlUæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
        DiscuzSession ds = new DiscuzSession(api_key, secret, url);Uæg.5’“=nt.discuz.netêš)áå—ì
        int uid = 0;Uæg.5’“=nt.discuz.netêš)áå—ì
        Int32.TryParse(this.txtUid.Text, out uid);Uæg.5’“=nt.discuz.netêš)áå—ì
        ds.Login(uid, this.txtPassword.Text, false, 10, "");Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
论坛扩展中设置的返回URl是自己站点的页面Uæg.5’“=nt.discuz.netêš)áå—ì
http://localhost:8086/DiscuzReturn.aspxUæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
登录后是到这个返回页面获取Auth_Token吗?Uæg.5’“=nt.discuz.netêš)áå—ì
DiscuzSession ds = new DiscuzSession(api, secret, url);Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
ds.GetSessionFromToken(Request.QueryString["auth_token"]);Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
如果是的话,调用ds.login方法后没有转到返回页面。Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/6/2 16:28:00
ds.login只是写cookie,没有做调用Uæg.5’“=nt.discuz.netêš)áå—ì
jasonf430 - 2009/6/2 16:39:00
那在外部怎么登录论坛?Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/6/2 16:45:00
如果cookie写的正确,就可以登陆。论坛可以根据读取到的cookie的状态判断是否登录Uæg.5’“=nt.discuz.netêš)áå—ì
jasonf430 - 2009/6/2 16:59:00
我现在不需要论坛的修改用户信息页面,在点击用户中心后,转到我自己的一个用户信息页面,Uæg.5’“=nt.discuz.netêš)áå—ì
然后在此页面来更新该用户的个人信息。这个该怎么做?Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
获取Sessionkey的步骤为:登录--获取AuthToken--调用auth.getSession --获取SessionkeyUæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
登录是什么方式登录?在论坛页面登录还是通过APi,或者都可以?Uæg.5’“=nt.discuz.netêš)áå—ì
登录后是怎么转向到返回地址中设置的页面的(我设的自己站点的一个页面)?Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/6/3 8:56:00
你可以看看置顶帖的整合实例,自己研究一下。Uæg.5’“=nt.discuz.netêš)áå—ì
这些东西一下讲不明白Uæg.5’“=nt.discuz.netêš)áå—ì
chuanla - 2009/7/31 8:55:00
这次我明白了Uæg.5’“=nt.discuz.netêš)áå—ì
diaoyunji - 2009/7/31 9:22:00
谢谢楼主,学习了Uæg.5’“=nt.discuz.netêš)áå—ì
shg2net - 2009/8/13 10:30:00
原帖由 doopcl 于 2009/6/2 16:45:00 发表Uæg.5’“=nt.discuz.netêš)áå—ì
如果cookie写的正确,就可以登陆。论坛可以根据读取到的cookie的状态判断是否登录
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
密码部分是怎么加密的?Uæg.5’“=nt.discuz.netêš)áå—ì
九重天之玄 - 2009/8/27 16:59:00
16768Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
我的报这个错,怎么办啊Uæg.5’“=nt.discuz.netêš)áå—ì
是在注册页面写api代码,报的错误Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/8/27 17:20:00
你是不是请求的地址没写对啊Uæg.5’“=nt.discuz.netêš)áå—ì
zw8610 - 2009/8/31 8:38:00
asdasdasdasdasdasdsadUæg.5’“=nt.discuz.netêš)áå—ì
passers - 2009/9/8 14:48:00
此API是否适用于日后更新版本.Uæg.5’“=nt.discuz.netêš)áå—ì
如果再升级新版本是否仍继续有效.还是要重新整合了.Uæg.5’“=nt.discuz.netêš)áå—ì
passers - 2009/9/8 14:54:00
API KEY又从哪来.怎么没看到说明呢.Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/9/8 15:19:00
适用于日后的版本,论坛升级接口也不会变化。不会给整合程序带来任何代码上的变动。Uæg.5’“=nt.discuz.netêš)áå—ì
doopcl - 2009/9/8 15:20:00
apikey是在论坛的后台处生成的,该指南应该有专门的说明。?Uæg.5’“=nt.discuz.netêš)áå—ì
passers - 2009/9/8 16:48:00
远程服务器返回错误: (404) 未找到。 Uæg.5’“=nt.discuz.netêš)áå—ì
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
异常详细信息: System.Net.WebException: 远程服务器返回错误: (404) 未找到。Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
源错误: Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
行 161:                    swRequestWriter.Close();Uæg.5’“=nt.discuz.netêš)áå—ì
行 162:Uæg.5’“=nt.discuz.netêš)áå—ì
行 163:                response = (HttpWebResponse)request.GetResponse();Uæg.5’“=nt.discuz.netêš)áå—ì
行 164:                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))Uæg.5’“=nt.discuz.netêš)áå—ì
行 165:                {Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
源文件: f:\MyHouse\App_Code\DiscuzToolkit\Util.cs    行: 163 Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
出现这错误是什么意思呢.后台应用程序设置里填的如下:Uæg.5’“=nt.discuz.netêš)áå—ì
应用程序 Url 地址: http://localhostUæg.5’“=nt.discuz.netêš)áå—ì
登录完成后返回地址: http://localhost/bbsUæg.5’“=nt.discuz.netêš)áå—ì
允许的服务器IP地址: 127.0.0.1 Uæg.5’“=nt.discuz.netêš)áå—ì
这样不对吗?Uæg.5’“=nt.discuz.netêš)áå—ì
passers - 2009/9/8 16:58:00
原帖由 doopcl 于 2009/8/27 17:20:00 发表Uæg.5’“=nt.discuz.netêš)áå—ì
你是不是请求的地址没写对啊
Uæg.5’“=nt.discuz.netêš)áå—ì
Uæg.5’“=nt.discuz.netêš)áå—ì
请问请求的地址是指哪一个?网站吗.还是论坛?Uæg.5’“=nt.discuz.netêš)áå—ì
123
查看完整版本: Discuz!NT API使用指南(更新至5月14日)