Discuz!NT
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ê)áåì

Uæ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ê)áåì
Uæ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 --获取Sessionkey
Uæ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.aspx?Uæg.5=nt.discuz.netê)áåìsig=d5f3507f828c1c6c101c82d777861311&api_key=81e86044e429674c229187005ae66e46
Uæg.5=nt.discuz.netê)áåì&fields=user_name,nick_name&method=users.getInfo&uids=1
Uæ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_name
method=users.getInfouids=
Uæg.5=nt.discuz.netê)áåì1
f974283986424571dc6a67f83fd0c3faUæ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

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ê)áåì
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ê)áåì