首页 / 浏览问题 / 云GIS / 问题详情
iServer 8C RESTAPI发布服务失败
24EXP 2016年11月16日
使用以下代码调用rest api发布地图服务,发布失败,请帮们看下原因。

<script type="text/javascript">
        var host = "http://localhost:8090";
        //令牌有效期是一年
        var token = "QTPQVdeePnFEusfoGz8y7uhfCRCZGlv5PaFy_tBEtNmRwp6UO_tXrV3eSC5IwbXg_Q0LRjOb3khRjZABmud9nw..";

        function AutoOracleDwgToSV() {//自动更新oracle地图服务
            var commit=getcommit();
            var method="post";
            var uri = host + "/iserver/manager/workspaces.rjson?token=" + token;
            var async=false;
            var user="";
            var password="";
            //以下示例请求体
            //"servicesTypes": ["RESTMAP", "RESTDATA", "WMS111"], "workspaceConnectionInfo": "../samples/data/World/World.sxwu"
            commit.open(method,encodeURI(uri),async,user,password);
            commit.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

            //设置请求条件
            var requestbody = {};
            requestbody.servicesTypes=["RESTMAP", "RESTDATA", "WMS111"];
            requestbody.workspaceConnectionInfo={
                server="ORCL_10.6.1.0",
                username="sys",
                password="sa",
                type="ORACLE",
                database="",
                name="workspaceoracle",
                driver=null        
            };
           
            commit.send(toJSON(requestbody));//发送请求
            var response = json_parse(commit.responseText, null);
            console.log(requestbody,response,"发布复合数据集请求体及响应");
            var container = document.getElementById('container');
            container.innerHTML +=toJSON(response)+"<br>";
        }
    </script>

1个回答

看下请求返回状态,检查token是否有效,可以直接测试:
http://${serverhost}/iserver/manager/workspaces.rjson?token=${yourtoken}
${}换成相应内容
认证失败是返回401状态吗,errorMsg会显示失败原因,需要认证或者无效令牌
1,780EXP 2016年11月16日
另外,如果浏览器有cookie(比如登陆过iServer管理页并且勾选了“记住我”),不带token也可以认证成功,注意,浏览器限制JavaScript获取请求头,不能先用登陆服务再获取请求头然后发请求时设置获得的请求头的方式

直接使用http://${serverhost}/iserver/manager/workspaces.rjson?token=${yourtoken}测试返回成功,可以得到当前已发布的工作空间。应该说明我现在用的token是有效的。可是发布oracle的工作空间还是失败?

直接在iServer发布Oracle工作空间能成功么?失败返回什么信息?
发布Oracle工作空间需要
1.iServer所在机器有相同位数的Oracle客户端,比如iServer和Oracle客户端都是64位的
2.iServer所在机器Oracle客户端能连上Oracle服务端
3.最后一次编辑工作空间和数据源的iDesktop版本不能高于iServer版本

1、直接在Iserver上发布这个oracle工作空间可以成功。

2、Oracle和iserver都是32位的.

3、iServer所在机器Oracle客户端能连上Oracle服务端,并且所用的版本都是8c

4、就是直接用上述代码发布的时候,没反应。我是新手不知道从哪里查看失败返回的信息。

刚没看你的请求体,因该是servicesTypes参数有问题

建议浏览器f12,网络那里查看你发的请求及返回结果,也可以使用fiddler工具抓取网络请求
直接抓iServer发布工作空间时的请求,看下传的什么参数
另外Oracle数据源不需要这么去更新服务,除非增加或减少服务类型,你可以试下iDesktop直接打开iServer发布的Oracle工作空间,一般来说增删地图、图层、数据集可以在保存工作空间后iServer这边立即就能看到改变,编辑属性、增删要素最迟不超过30s

咦,好像参数没问题
那你看下响应状态和返回信息

不好意思又打扰你了。我调试后发现提示错误“{"error":{"code":500, "errorMsg":"工作空间连接信息错误"}, "succeed":false}”。可是我用同样的连接信息直接在iserver上发布此工作空间时成功的。这是什么原因啊?
试下不要用localhost呢?

我把localhost换成我自己本机的ip,修改为http://10.7.1.34:8090,还是提示“工作空间连接信息错误”

是这个原因:
requestbody.workspaceConnectionInfo={
                server="ORCL_10.6.1.0",
                username="sys",
                password="sa",
                type="ORACLE",
                database="",
                name="workspaceoracle",
                driver=null        
            };
workspaceConnectionInfo属性改成字符串,分号隔开...,看我上面抓的请求,workspaceConnectionInfo不是个对象,只是个字符串...

没明白您的意思。我发布本地服务也提示这个错误。

本地服务是这样写的:

requestbody.servicesTypes = ["RESTMAP"];
requestbody.workspaceConnectionInfo = ["F:/TestData/发布服务数据/kqcgislocal.smwu"];

你说的改成字符串是什么意思?能举个例子吗?

我是参考帮助文档写的。
请放大看前面的截图,请求体比如:
{"workspaceConnectionInfo": "server=orcl203;username=test;password=test;type=ORACLE;database=;name=testWorkSpace;driver=null",其他参数}
...