调用webservice报错401,我知道用户名和密码,但怎么传给服务器呢?

symantec2 2011-06-20 01:22:42
如题。
要调用一个基于SOAP的Webservice,对方服务器端的开发环境不详。而且需要身份验证。

我通过IP找到WSDL文件。 只用最原始的办法,根据WSDL的描述自己构造SOAP消息,发出去。回复报错401,unauthorized。

后来又用SoapUI测试,soap消息不会有问题了,还是报错401。


第一:报错401能不能确定就是用户名和密码的问题?会不会因为我调用的不对,或者开发环境不对,比如服务器端是.NET而我用的是JavaBean。

第二:要登陆的话我这里也没有弹出输入身份验证的对话框,wsdl里面也找不到login的方法可以调用。用户名和密码我都知道,但不知道怎么递交给服务器?


很着急,老师一直在等结果,我又是新手搞不定,请各位大侠出手相救/// 在线等
谢谢谢谢谢谢
...全文
3185 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
N级 2013-08-07
  • 打赏
  • 举报
回复
我的Q229847511
N级 2013-08-07
  • 打赏
  • 举报
回复
你是怎样解决的?能否Q上交流下
fangxiaojuan2005 2012-11-01
  • 打赏
  • 举报
回复
我也碰到了这个问题,看了还是不知道怎么解决
symantec2 2011-06-24
  • 打赏
  • 举报
回复 1
终于搞定了

直接用HttpURLConnection是不行的,这个默认只是80端口。

最后是用 Java.Net的Authenticator类 把Username和Password直接投过去(他之后对位流的处理遵守http的basic身份验证机制)


代码很短:
import java.net.Authenticator;
import java.net.PasswordAuthentication;

class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ( "username ", "password ");
}
}
在程序中调用:
Authenticator.setDefault (new MyAuthenticator ());

希望对以后碰到这个问题的人有用

谢谢 trocp
zxy896 2011-06-20
  • 打赏
  • 举报
回复
学习
学习
symantec2 2011-06-20
  • 打赏
  • 举报
回复
好 如果是那个base机制 那我早上去试试

谢谢
oO临时工Oo 2011-06-20
  • 打赏
  • 举报
回复
soap 就是与平台无关,服务器用什么开发的给客户端没关系。

自动弹出的话,你每次使用时先链接到一个简单方法,应该会弹出登录框。

HTTP AUTH mechanism 应该说的说是那种简单密码认证方式,就像进办公小路由器时弹出的那种对话框。
symantec2 2011-06-20
  • 打赏
  • 举报
回复
恩,这个AXIS的方法记下了,明天一早去试试看。

又有个问题,我个人觉得既然服务器端被封装后留了wsdl描述的接口,那webservice本身是什么开发的是不是已经不重要? 只要调用客户端开发环境所定义的请求认证的方法就可以? 你举的AXIS是个好例子,其他比如xfire或者servlet也有特定的请求认证方法? 希望我理解对了。

我另外还有个思路,能不能从浏览器这里下功夫,让自动弹出验证框?浏览器有哪些验证机制?因为这个设备说明书里明确讲了:

This authentication is accomplished by the HTTP AUTH mechanism available in most SOAP clients.

他的意思应该是会自动要求输入验证信息的吧? 但我始终不理解这里说的 HTTP AUTH mechanism到底指的什么机制? 比如在Header里加验证吗?还是什么?
qiuxuejie 2011-06-20
  • 打赏
  • 举报
回复
真的有用?
oO临时工Oo 2011-06-20
  • 打赏
  • 举报
回复
假如服务器端的webservice是用AXIS写的,调用某一个方法时,可以在IE地址栏中输入

http://192.168.0.1/ws/services/service1?method=method1&args=a1,2,true

其中http://192.168.0.1/ws/是服务器webservice路径。
后面service1表示service名,method1表示调用的方法,a1,2,true表示参数

在IE中认证一次是不需要重复认证的,与WEB请求的Session是一个道理。

在Java客户端时,可能每次都要认证。因为会话不一定保留。

在使用AXIS的客户端时,简单认证方式就是创建Call的时候

Service service = new Service();
Call call = service.createCall();

call.setUsername($username);
call.setPassword($password);


Object result = call.invoke(new Object[]{"参数1","参数2"});


symantec2 2011-06-20
  • 打赏
  • 举报
回复
能在客户端调用几个方法让IE弹出身份认证吗?
symantec2 2011-06-20
  • 打赏
  • 举报
回复
谢谢帮忙

我这里具体情况这样

服务器端其实是个机器,因为只给了webservice这一种配置设备的方法,所以我只能用。

设备里webservice到底什么开发的说明书没说。

我客户端是Netbeans,java写的。浏览器IE。 我记得好像回复消息有个WWW-Authenticate头就能弹出认证框?


我该怎么办?

oO临时工Oo 2011-06-20
  • 打赏
  • 举报
回复
第一:认证方式与客户端环境有关。比如客户端是Java 还是 C# 还是 c++
第二:wsdl里没有认证声明,认证不是webservice soap协议标准的范畴。要在IE里调用方法时才会自动弹出认证选项框,IE里方法调用方式与服务器有关。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧