如果您想了解webservice的调用客户端参数List的实例,转换成xml格式和webservice接口调用xml参数组装的知识,那么本篇文章将是您的不二之选。我们将深入剖析webservice的调
如果您想了解webservice 的调用 客户端 参数 List和webservice接口调用 xml参数组装的知识,那么本篇文章将是您的不二之选。我们将深入剖析webservice 的调用 客户端 参数 List的各个方面,并为您解答webservice接口调用 xml参数组装的疑在这篇文章中,我们将为您介绍webservice 的调用 客户端 参数 List的相关知识,同时也会详细的解释webservice接口调用 xml参数组装的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- webservice 的调用 客户端 参数 List
- .Net客户端对WebService的调用(含WS-Security)
- angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
- ArcGIS For Silverlight API 开发中利用WebService调用ArcObjects
- axis 调用webservice (客户端)
webservice 的调用 客户端 参数 List
首先:需要用到的jar包axis-ant.jar,axis.jar,wsdl4j-1.5.1.jar
1、然后server-config.wsdd 文件的配置:
<?xml version="1.0" encoding="UTF-8"?>
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<parameter name="axis.sendMinimizedElements" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<handler name="soapmonitor" type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
<parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
<handler name="logging" type="java:com.aa.aa.util.LogHandler" />
<!--此处编写 自己的Action 即 需要 调用 远程Service相关的 功能-->
<service name="QueryDataAction" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor" />
<handler type="logging" />
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="com.aa.aa.querydata.action.QueryDataAction" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
2、web.xml配置---
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/showAllAxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
3、过滤器----由于web.xml配置文件中,struts2的映射是/*,自定义一个过滤器,放行webservice请求
public class WsFilter extends StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
System.out.println("----------------------");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (request.getRequestURI().contains("?wsdl")
|| request.getRequestURI().contains("showAllAxisServlet")
|| request.getRequestURI().contains("/services")) {
chain.doFilter(request, response);
} else {
try {
prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
if (excludedPatterns != null
&& prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request,
response, true);
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(
request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
}
} finally {
prepare.cleanupRequest(request);
}
}
}
}
4、前台 点击 按钮 通过Action再请求 service:
jsonArray的包:import net.sf.json.JSONArray;
public void aa(){
①参数 list List<Object> list, List<Object> list1
②将 list转为 json数组格式
JSONArray listJson = JSONArray.fromObject(list);
JSONArray list1Json = JSONArray.fromObject(list1);
③将list封装到map
Map map=new HashMap();
//是退回 还是 第一次插入
map.put("listJson ", listJson );
map.put("list1Json ", list1Json );
④调 接口的方法
query(map);
}
/**
* 调用 外部提供的 接口,
* @return
*/
private void query(Map params) throws RuntimeException {
Service service = new Service();
XMLRead reader = new XMLRead();
try {
// 封装参数xml字符串
String inXml = packageParamsXml(params);
Call call = (Call) service.createCall();
//此处为 wenservice服务器端的 url
String targetEendPoint = "http://192.168.88.128:81/country/services/SaveDataServiceImpl?wsdl";
//设置地址
call.setTargetEndpointAddress(new java.net.URL(targetEendPoint));
//设置要执行的方法
call.setOperationName(new QName(targetEendPoint,"saveCheckData"));//WSDL里面描述的接口名称
//接口的参数
call.addParameter(new QName(targetEendPoint, "inXml"), XMLType.SOAP_STRING, ParameterMode.IN);
//设置返回类型
call.setReturnType(new QName(targetEendPoint, "response"), String.class);
//设置返回的类型
//call.setReturnType(org.apache.axis.Constants.XSD_STRING);
//执行,调用webservice
String result = (String) call.invoke(new Object[]{inXml});
TreeMap m = reader.parseXml(result);
if ("0".equals(m.get("ifSuccess"))) {
throw new RuntimeException();
}
System.out.println("返回的结果是:"+result);
/* QName qn = new QName("urn:ParData","params1");
call.registerTypeMapping(ParData.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(ParData.class,qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(ParData.class,qn));
// 设置返回类型
call.setReturnType(qn, ParData.class);
call.setOperationName(qn);
call.addParameter("params1", qn, javax.xml.rpc.ParameterMode.IN);
ParData params1 = new ParData();
ParData ret = (ParData) call.invoke(new Object[] { params1 });
System.out.println("return value is " + ret);*/
} catch (Exception e) {
e.printStackTrace();
}
}
//封装 参数,将 参数 转换成 xml 格式,webservice的调用 所能传递的参数格式 xml
private String packageParamsXml(Map params) {
StringBuffer sbBuf = new StringBuffer();
sbBuf.append("<?xml version=''1.0'' encoding=''utf-8''?><tobacco action=''"+params.get("action")+"''>");
sbBuf.append("<dataset listJson =''"+params.get("listJson ")+"''/>");
sbBuf.append("<dataset list1Json =''"+params.get("list1Json ")+"''/>");
sbBuf.append("</tobacco>");
return sbBuf.toString();
}
.Net客户端对WebService的调用(含WS-Security)
(本文摘自互联网单元测试及实践)
在上一节中我们介绍了测试客户端调用的方法,本章节主要讲述在.net环境下客户端调用的方法,我们将着重介绍如何生成客户端代理,如何实现WSS客户端配置。
8.6.1 接口代理类的生成
在.net下对WebService的接口调用,很重要一点需要将Soap协议进行消息编码,使之成为net下可以调用的客户端。客户端的代理类必须从
在本章节中首先介绍如何使用VS2005自带的WebRefrence方法来生成代理类的方法。
下面就以
步骤一、在VS2005中新建工程TestHello,具体过程不在这里详述。
步骤二、在工程中Refrence右击,点击添加Web引用(Add Web Refrence),如图8.5。
图
步骤三、在添加Web引用的窗体中的Url编辑框输入Wsdl的地址,并点击go,编辑器自动会获取Wsdl中的Soap协议内容。在Web refrence name的编辑框中可以编辑引用名称(如图8.6)。在本例中输入APPTEST。
图 8.6
步骤四,点击add reference之后,系统自动生成代理类文件。点击VS2005编辑器菜单->project->Show all files,在工程目录下可以看见一个APPTEST的文件包,打开包文件下面有个refrence.map->refrence.cs。下面对其中代码要点进行讲解。
代码8.14
public partial class AppConsumeService: System.Web.Services.Protocols.
SoapHttpClientProtocol {
//实现代码
}
由片段一的代码可以知道代理类是从
代码8.15
01 [System.Web.Services.Protocols.soapDocumentMethodAttribute("urn:checkBalance",
02 RequestNamespace="http://account.api.core.aep.alisoft.com",
03 ResponseNamespace="http://account.api.core.aep.alisoft.com",
04 Use=System.Web.Services.Description.soapBindingUse.Literal,
05 ParameterStyle=System.Web.Services.Protocols.soapParameterStyle.Wrapped)]
06 [return: System.Xml.Serialization.XmlElementAttribute("return",IsNullable=true)]
07 public string checkBalance([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] string param0,
08 [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] string param1,
09 double param2,
10 [System.Xml.Serialization.XmlIgnoreAttribute()] bool param2Specified) {
11 object[] results = this.Invoke("checkBalance",new object[] {
12 param0,
13 param1,
14 param2,
15 param2Specified});
16 return ((string)(results[0]));
17 }
在代码8.15中读者容易发现,由VS2005自动生成的代理类,已经根据webservice发布的wsdl文件,将其中的方法进行了映射,如例子中提到的checkbalance的方法。同时在代码1-6行,明确指出解析该段代码和wsdl之间的映射关系,包括它所属的命名空间等信息。
使用VS2005来自动生成客户端,是编写客户端测试代码比较理想的方法。但是,如果你想直接编辑客户端发送的
打开WSS(如图8.7),在编辑框WSDL ENDPOINT中输入相应的WSDL地址,还是以
图8.7
在做完前面的步骤之后,点击request/Response菜单将看到,实际上在消息层面发生的Soap消息内容。如图8.8,可以编辑红色边框中的内容,点击Send键实现直接在消息层面的测试。
图8.8
同时也可以使用WSS工具生成相应的.net代码的代理类。只要点击WSDLS&Proxy菜单。在左侧的树形编辑框中点击Proxy就可以看见相应的代理类的C#代码,读者只要拷贝的自己的工程中既可以使用。
8.6.2 有WS-Security的客户端调用
本章节将介绍一下如何用.net做为客户端调用带有数字签名验证的服务器端方法。对服务器端要求进行签名验证的方法测试,需要在调用服务器端方法之前,对消息头的信息装载签名私钥的信息。为此,本章将介绍如何制作可以在.net下使用的证书;如何在.net下应用证书进行签名;编写测试用例。
制作证书有很多方法,本文介绍的方法是如何将jks文件中信息导入到Windows环境的证书管理器中便于.net的调用。
步骤一、按8.5.2章节中的代码8.13 keygen.bat生成0001.jks。
步骤二、使用工具JKS2PFX.bat将0001.jks转换成可以导入Windows证书管理器的pfx文件。执行代码片段如:代码8.16,得到0001.pfx。
代码8.16
1 jks2pfx 0001.jks 123456 123456 0001
步骤三、将证书导入到Windows证书管理器中。在cmd中输入mmc打开Windows控制台,点击添加/删除管理单元-证书。得到如图8.9节目,点击证书(当前用户)->个人->证书。右键点击导入证书,将证书导入到个人证书文件管理组下。
图 8.9
步骤四、将个人证书下的别名是mike的证书(即步骤三导入的证书),剪切到受信任的根证书颁发机构目录下,使证书授信。
步骤五、将授信过的证书拷贝回个人->证书文件夹。
步骤六、重复步骤一至步骤五的做法,将服务器端公钥引入到证书管理器。
本文将介绍如何使用Microsoft WSE2.0完成对WS-Security签名的装载。在使用这种方法之前首先要安装Micorsoft WSE2.0的工具,工具存放路径CD:kkkkk。本例中将新建一个工程TestWSE,并在上面逐步完成WSE配置以及代码中关于配置部分的编写。
步骤一、在工程中添加Web引用,详细步骤如8.6.1中介绍。在添加完Web引用之后,在工程中会增加一个app.config文件。
步骤二、打开程序列表中WSE2.0->Configuration Editor(如图8.10),点击file->open打开在步骤一中新增的app.config文件。勾选Enable this project for Web Services Enhancements。点击Policy,勾选Enable Policy;点击Add,在弹出窗体上点击OK,进入Security配置向导,点击Next;选择Secure a client application点击Next;在消息设置框选择对Request和Response的消息进行签名设置,点击Next;点击Select Certificate,选择相应的证书Mike;在Trusted Server Certificates窗体中,点击Add,选择包含服务器端公钥的证书。点击Save,配置WSE代理文件完成。
步骤三、刷新工程,点击Show All Files会发现新增了一个文件PolicyCache.config,把该文件添加到工程中。在Reference中添加Microsoft.Web.Services2的引用,修改Reference.cs文件中代码,将代理类的基类由原先的System.Web.Services.Protocols.soapHttpClientProtocol改成Microsoft.Web.Services2.WebServicesClientProtocol。
步骤四、读者可以根据自己的实际情况编辑PolicyCache.config文件。如果只需要对发送的消息进行签名,那么只需要Request的代理如<request policy="#Sign-X.509-5" />,那么读者可以删除关于response policy相关的信息。同时也可以根据实际情况修改wssp:MessageParts决定对消息的哪些部分进行签名,这个需要设置和服务器相匹配的配置。本文只关心对客户端发送的消息进行签名,所以对删除response policy的相关内容。
完成前面四个步骤的设置,就完成了对.net下WS-Security的配置。下面介绍一下如何编写测试代码进行测试。
本小节主要介绍如何使用NUnit框架编写调用带有WS-Security测试用例。本文将在TestWSE工程的基础上进行代码编写。
首先,在工程中引入NUnit Framework组件。右键点击Add Reference,选择nunit.framework,点击OK。
在文件头中,添加代码using NUnit.Framework,在类的声明前添加[TestFixture],同时在编写每个测试用例代码时方法前面添加[Test],示例代码如代码片段8.17
代码8.17
04行:添加NUnit.Framework引用
13行:新建代理类的实例
14行:调用待测试的服务器端代码
15行:对调用的结果进行断言
angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
Can’t resolve all parameters for AuthenticationService: ([object Object],?,[object Object])
我已经检查了几乎每个主题,并尝试了多种方法来解决它,但仍然无法在第二天击败它.
我试图像这样在appService中注入第一个authService但是得到了同样的错误
@Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService
我检查了所有DI和服务内部的导入顺序,在我看来一切都是正确的
如果有人可以帮我处理它,我很感激.
Angular 4.0.0
AuthService
import { Injectable } from '@angular/core'; import {Http,Headers,Response} from '@angular/http'; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; import {AppServices} from "../../app.services"; import {Router} from "@angular/router"; @Injectable() export class AuthenticationService { public token: any; constructor( private http: Http,private appService: AppServices,private router: Router ) { this.token = localStorage.getItem('token'); } login(username: string,password: string): Observable<boolean> { let headers = new Headers(); let body = null; headers.append("Authorization",("Basic " + btoa(username + ':' + password))); return this.http.post(this.appService.api + '/login',body,{headers: headers}) .map((response: Response) => { let token = response.json() && response.json().token; if (token) { this.token = token; localStorage.setItem('Conform_token',token); return true; } else { return false; } }); } logout(): void { this.token = null; localStorage.removeItem('Conform_token'); this.router.navigate(['/login']); } }
应用服务
import {Injectable} from '@angular/core'; import {Headers,Http,RequestOptions} from '@angular/http'; import {Router} from "@angular/router"; import {AuthenticationService} from "./auth/auth.service"; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; @Injectable() export class AppServices { api = '//endpoint/'; public options: any; constructor( private http: Http,private router: Router,public authService: AuthenticationService // doesn't work // @Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService // doesn't work either ) { let head = new Headers({ 'Authorization': 'Bearer ' + this.authService.token,"Content-Type": "application/json; charset=utf8" }); this.options = new RequestOptions({headers: head}); } // ==================== // data services // ==================== getData(): Promise<any> { return this.http .get(this.api + "/data",this.options) .toPromise() .then(response => response.json() as Array<Object>) .catch((err)=>{this.handleError(err);}) }
应用模块
import { browserModule } from '@angular/platform-browser'; import { browserAnimationsModule } from '@angular/platform-browser/animations'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import {BaseRequestOptions,HttpModule} from '@angular/http'; import { MaterialModule} from '@angular/material'; import {FlexLayoutModule} from "@angular/flex-layout"; import 'hammerjs'; import { routing,appRoutingProviders } from './app.routing'; import { AppServices } from './app.services'; import {AuthGuard} from "./auth/auth.guard"; import {AuthenticationService} from "./auth/auth.service"; import {AppComponent} from './app.component'; import {AuthComponent} from './auth/auth.component'; import {NotFoundComponent} from './404/not-found.component'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent,AuthComponent,NotFoundComponent,HomeComponent ],imports: [ browserModule,browserAnimationsModule,FormsModule,HttpModule,routing,MaterialModule,FlexLayoutModule ],providers: [AppServices,AuthGuard,AuthenticationService],bootstrap: [AppComponent] }) export class AppModule { }
解决方法
你可以使用
export class AuthenticationService { public token: any; appService: AppServices; constructor( private http: Http,// private appService: AppServices,injector:Injector; private router: Router ) { setTimeout(() => this.appService = injector.get(AppServices)); this.token = localStorage.getItem('token'); }
另见DI with cyclic dependency with custom HTTP and ConfigService
要避免使用setTimeout,您还可以从AppService的构造函数中设置AuthenticationService.appService(或者相反)
ArcGIS For Silverlight API 开发中利用WebService调用ArcObjects
ADF之所以强大,除了其本身的类库外,它还能在服务器端调用AO,来完成比如在线编辑或者Geoemtry的处理工作;而ESRI官方的说法,建立在REST服务基础上的程序目前都不具备在线编辑的功能(因为要与服务器端的数据库打交道),但他们把这项功能作为日程,提到了研发计划内。目前而言,要在SilverlightAPI中完成数据编辑工作,他们的劝告是,“如果你不怕把你的双手弄脏,那就去做吧”。
AO本身是COM组件,.NET是利用COMInterop技术与其打交道的,这显然是Silverlight的客户端环境办不到的。这就需要与服务器端进行通信。Silverlight与服务器端通信,最常用的是WebClient类,稍复杂的还有HttpWebRequest类,而传统的ASP.NET WebService与更强大的WCF则为远程调用AO提供了可能。
下面是我做测试的一段代码:
进行程序调试,可以正确显示出点坐标信息。 通过这个功能的成功测试后,就可在Silverlight环境下开发ARCGIS的强大应用功能了。
axis 调用webservice (客户端)
package com.client;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class AxisClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ServiceTest/services/Math?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setoperationName(new QName("http://demo.webservice.samland/","echo"));
String ret = (String) call.invoke(new Object[] {"Samland"});
System.out.println("Sent ''Hello!'',got ''" + ret + "''");
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
我们今天的关于webservice 的调用 客户端 参数 List和webservice接口调用 xml参数组装的分享已经告一段落,感谢您的关注,如果您想了解更多关于.Net客户端对WebService的调用(含WS-Security)、angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])、ArcGIS For Silverlight API 开发中利用WebService调用ArcObjects、axis 调用webservice (客户端)的相关信息,请在本站查询。
本文标签: