java调用.net webservice 返回图片

 关键字: axis

由于没学习过. net ,最近程序中需要调用. netwebservice 接口得到一张图片。在网上找了好多资料选用的axis来实现调用。
首先看看. net 实现Webmehod的两种方式,这两种方式 java 传参数的方式也有不同
1.rpc方式:
Java 代码
  1. using System;     
  2. using System.Collections;     
  3. using System.ComponentModel;     
  4. using System.Data;     
  5. using System.Linq;     
  6. using System.Web;     
  7. using System.Web.Services;     
  8. using System.Web.Services.Protocols;     
  9. using System.Xml.Linq;     
  10.     
  11. namespace WebService1     
  12. {         
  13.          
  14.     [WebService (Namespace = "http://tempuri.org/" )]     
  15.     public   class  Service1 : System.Web.Services.WebService      
  16.     {     
  17.     
  18.         [WebMethod]     
  19.         [SoapRpcMethod(Action = "http://tempuri.org/hello" , RequestNamespace =  "http://tempuri.org/" , ResponseNamespace =  "http://tempuri.org/" )]     
  20.     
  21.         public  string hello(String s)     
  22.         {     
  23.             return   "Hello," +s;     
  24.         }     
  25.     }     
  26. }    
using System;   
using System.Collections;   
using System.ComponentModel;   
using System.Data;   
using System.Linq;   
using System.Web;   
using System.Web.Services;   
using System.Web.Services.Protocols;   
using System.Xml.Linq;   
  
namespace WebService1   
{       
       
    [WebService
(Namespace = "http://tempuri.org/")]   
    public class Service1 : System.Web.Services.WebService
   
    {   
  
        [WebMethod]   
        [SoapRpcMethod(Action = "http://tempuri.org/hello", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]   
  
        public string hello(String s)   
        {   
            return "Hello,"+s;   
        }   
    }   
}  


2.Document方式:
Java 代码
  1. namespace WebService1     
  2. {         
  3.          
  4.     [WebService (Namespace = "http://tempuri.org/" )]     
  5.     public   class  Service1 : System.Web.Services.WebService      
  6.     {     
  7.     
  8.         [WebMethod]             
  9.         public  string hello(String s)     
  10.         {     
  11.             return   "Hello," +s;     
  12.         }     
  13.     }     
  14. }    
namespace WebService1   
{       
       
    [WebService
(Namespace = "http://tempuri.org/")]   
    public class Service1 : System.Web.Services.WebService
   
    {   
  
        [WebMethod]           
        public string hello(String s)   
        {   
            return "Hello,"+s;   
        }   
    }   
}  







下面是 java 调用的代码
Java 代码
  1. package  com.ctitc.analysis.util;  
  2.   
  3. import  java .io.FileOutputStream;  
  4. import  java .io.IOException;  
  5. import  java .net .MalformedURLException;  
  6. import  java .rmi.RemoteException;  
  7. import  java .util.Date;  
  8.   
  9. import  javax.xml.namespace.QName;  
  10. import  javax.xml.rpc.ParameterMode;  
  11. import  javax.xml.rpc.ServiceException;  
  12.   
  13. import  org.apache.axis.client.Call;  
  14. import  org.apache.axis.client.Service;  
  15. import  org.apache.axis.encoding.XMLType;  
  16.   
  17. import  sun.misc.BASE64Decoder;  
  18.   
  19. import  com.ctitc.analysis.pojo.GisChartInfo;  
  20.   
  21.   
  22. /*  
  23.  * 调用.netwebservice 方法获取gis生成的图片地址  
  24.  *   
  25.  * */   
  26. public   class  GetWebService {  
  27.       
  28.      public  String getWebService(String imagePath,GisChartInfo gisChartInfo) {       
  29.             String picUrl = "" ;           
  30.             try  {  
  31.                 // WebService  URL    
  32.                 String url = "http://192.168.5.92/JttMapService/Service.asmx" ;  
  33.                 String namespace = "http://www.fzkcy.com/" ;  
  34.                 String method = "WebChartNew" ;  
  35.                   
  36.                 //创建调用服务   
  37.                 Service service = new  Service();  
  38.                 Call call = (Call) service.createCall();             
  39.                 call.setTargetEndpointAddress(new  java .net .URL(url));  
  40.                 /*如果.net 在提供Rpc服务时设置成   
  41. <pre name="code" class="java ">[SoapRpcMethod(Action = "",.....  
  42. </pre>  则不需要再设置call.setUseSOAPAction和call.setSOAPActionURI*/   
  43. <br>  
  44. <br>  
  45. <br>                call.setUseSOAPAction(true );  
  46. <br>                call.setSOAPActionURI("http://www.fzkcy.com/WebChartNew" );  
  47. <br>                  
  48. <br>                // 设置要调用的方法    
  49. <br>                call.setOperationName(new  QName(namespace, method));    
  50. <br>                  
  51. <br>                // 该方法需要的参数    
  52. <br>                  
  53. <br>                call.addParameter(new  QName(namespace, "layername" ),XMLType.XSD_STRING,ParameterMode.IN);  
  54. <br>                call.addParameter(new  QName(namespace, "width" ),XMLType.XSD_INT,ParameterMode.IN);  
  55. <br>                call.addParameter(new  QName(namespace, "height" ),XMLType.XSD_INT,ParameterMode.IN);  
  56. <br>                call.addParameter(new  QName(namespace, "imageType" ),XMLType.XSD_STRING,ParameterMode.IN);  
  57. <br>                call.addParameter(new  QName(namespace, "fieldnames" ),XMLType.XSD_STRING,ParameterMode.IN);  
  58. <br>                call.addParameter(new  QName(namespace, "fieldvalues" ),XMLType.XSD_STRING,ParameterMode.IN);  
  59. <br>                call.addParameter(new  QName(namespace, "rgbcolors" ),XMLType.XSD_STRING,ParameterMode.IN);  
  60. <br>                call.addParameter(new  QName(namespace, "chartType" ),XMLType.XSD_STRING,ParameterMode.IN);  
  61. <br>                call.addParameter(new  QName(namespace, "size" ),XMLType.XSD_STRING,ParameterMode.IN);    
  62. <br>//以下传参数方式为 Rpc方式   
  63. <br>                //               call.addParameter("layername",XMLType.XSD_STRING,ParameterMode.IN);                   
  64. <br>//              call.addParameter("width",XMLType.XSD_INT,ParameterMode.IN);   
  65. <br>//              call.addParameter("height",XMLType.XSD_INT,ParameterMode.IN);   
  66. <br>//              call.addParameter("imageType",XMLType.XSD_STRING,ParameterMode.IN);   
  67. <br>//              call.addParameter("fieldnames",XMLType.XSD_STRING,ParameterMode.IN);   
  68. <br>//              call.addParameter("fieldvalues",XMLType.XSD_STRING,ParameterMode.IN);   
  69. <br>//              call.addParameter("rgbcolors",XMLType.XSD_STRING,ParameterMode.IN);   
  70. <br>//              call.addParameter("chartType",XMLType.XSD_STRING,ParameterMode.IN);   
  71. <br>//              call.addParameter("size",XMLType.XSD_STRING,ParameterMode.IN);   
  72. <br>                // 方法的返回值类型                
  73. <br>                call.setReturnType(XMLType.XSD_STRING);  
  74. <br>                                        
  75. <br>                //设置参数    
  76. <br>                String layername = gisChartInfo.getLayername();  
  77. <br>             int  width = gisChartInfo.getWidth();  
  78. <br>             int  height = gisChartInfo.getHeight();  
  79. <br>             String imageType = gisChartInfo.getImageType();   
  80. <br>             String fieldnames = gisChartInfo.getFieldnames();  
  81. <br>             String fieldvalues = gisChartInfo.getFieldvalues();  
  82. <br>             String rgbcolors = gisChartInfo.getRgbcolors();  
  83. <br>             String chartType = gisChartInfo.getChartType();  
  84. <br>             String size = gisChartInfo.getSize();  
  85. <br>               
  86. <br>             Object[] parameters = new  Object[]{layername,width+ "" ,height+ "" ,imageType,fieldnames,fieldvalues,rgbcolors,chartType,size};             
  87. <br>              // 调用该方法    
  88. <br>             byte [] imageBytes ;  
  89. <br>             BASE64Decoder dec=new  BASE64Decoder();   
  90. <br>             imageBytes = dec.decodeBuffer(call.invoke(parameters).toString());  
  91. <br>             System.out.println(imageBytes);  
  92. <br>                //在指定位置生成图片   
  93. <br>                Date date = new  Date();  
  94. <br>                picUrl = imagePath+date.getTime()+"." +gisChartInfo.getImageType();     
  95. <br>                FileOutputStream out = new  FileOutputStream(picUrl);  
  96. <br>                System.out.println(imageBytes.length);  
  97. <br>                out.write(imageBytes ,0 ,imageBytes.length);        
  98. <br>                out.flush();  
  99. <br>                out.close();                  
  100. <br>            } catch  (RemoteException e) {     
  101. <br>                // TODO Auto-generated catch block      
  102. <br>                e.printStackTrace();     
  103. <br>            } catch  (MalformedURLException e) {     
  104. <br>                // TODO Auto-generated catch block      
  105. <br>                e.printStackTrace();     
  106. <br>            }catch  (ServiceException e) {     
  107. <br>                // TODO Auto-generated catch block      
  108. <br>                e.printStackTrace();   
  109. <br>            }catch  (IOException e) {  
  110. <br>                // TODO Auto-generated catch block   
  111. <br>                e.printStackTrace();  
  112. <br>            }   
  113. <br>             
  114. <br>            return  picUrl;     
  115. <br>        }    
  116. <br>       
  117. <br>     public   static   void  main(String args[]){  
  118. <br>         GisChartInfo gisChartInfo = new  GisChartInfo();  
  119. <br>         gisChartInfo.setLayername("地市行政区划" );  
  120. <br>         gisChartInfo.setWidth(800 );  
  121. <br>         gisChartInfo.setHeight(800 );  
  122. <br>         gisChartInfo.setImageType("JPG" );  
  123. <br>         gisChartInfo.setFieldnames("行政区划代码,县道,乡道,村道,专用道路" );  
  124. <br>         gisChartInfo.setFieldvalues("3501,1791.561,2327.151,4659.821,9.656;"  +  
  125. <br>                                    "3502,493.664,665.151,405.498,0;"  +  
  126. <br>                                    "3503,676.446,981.887,3266.88,3.095;"  +  
  127. <br>                                    "3504,1846.326,6357.708,3388.415,0;"  +  
  128. <br>                                    "3505,1966.458,6469.783,4600.375,1.461;"  +  
  129. <br>                                    "3506,1692.84,3526.773,3656.503,0;"  +  
  130. <br>                                    "3507,1541.45,6636.189,3572.128,99.667;"  +  
  131. <br>                                    "3508,1797.244,6723.257,1750.648,296.853;"  +  
  132. <br>                                    "3509,1725.352,1903.754,4550.091,58.943" );  
  133. <br>         gisChartInfo.setRgbcolors("0,92,230;132,0,128;56,168,0;255,128,0" );  
  134. <br>         gisChartInfo.setChartType("BAR" );         
  135. <br>         gisChartInfo.setSize("30,10" );  
  136. <br>        System.out.println(new  GetWebService().getWebService( "d:/GisPictures/" , gisChartInfo));  
  137. <br>  
  138. <br>    }  
  139. <br>  
  140. <br>  
  141. <br>}  
  142. <br>  
  143. <br>  
package com.ctitc.analysis.util;

import java
.io.FileOutputStream;
import java
.io.IOException;
import java
.net
.MalformedURLException;
import java
.rmi.RemoteException;
import java
.util.Date;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

import sun.misc.BASE64Decoder;

import com.ctitc.analysis.pojo.GisChartInfo;


/*
 * 调用.netwebservice
方法获取gis生成的图片地址
 * 
 * */
public class GetWebService {
	
	 public String getWebService(String imagePath,GisChartInfo gisChartInfo) {     
			String picUrl = "";	        
	        try {
	        	// WebService
 URL 
	        	String url = "http://192.168.5.92/JttMapService/Service.asmx";
	        	String namespace = "http://www.fzkcy.com/";
	        	String method = "WebChartNew";
	        	
	        	//创建调用服务
	        	Service service = new Service();
	            Call call = (Call) service.createCall();           
	            call.setTargetEndpointAddress(new java
.net
.URL(url));
	            /*如果.net
在提供Rpc服务时设置成 

   
   
Java 代码
  1. [SoapRpcMethod(Action =  "" ,.....  
  则不需要再设置call.setUseSOAPAction和call.setSOAPActionURI*/


            call.setUseSOAPAction(true);
            call.setSOAPActionURI("http://www.fzkcy.com/WebChartNew");
           
            // 设置要调用的方法
            call.setOperationName(new QName(namespace, method)); 
           
            // 该方法需要的参数
           
            call.addParameter(new QName(namespace,"layername"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"width"),XMLType.XSD_INT,ParameterMode.IN);
            call.addParameter(new QName(namespace,"height"),XMLType.XSD_INT,ParameterMode.IN);
            call.addParameter(new QName(namespace,"imageType"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"fieldnames"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"fieldvalues"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"rgbcolors"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"chartType"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"size"),XMLType.XSD_STRING,ParameterMode.IN); 
//以下传参数方式为 Rpc方式
            //             call.addParameter("layername",XMLType.XSD_STRING,ParameterMode.IN);              
//             call.addParameter("width",XMLType.XSD_INT,ParameterMode.IN);
//             call.addParameter("height",XMLType.XSD_INT,ParameterMode.IN);
//             call.addParameter("imageType",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("fieldnames",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("fieldvalues",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("rgbcolors",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("chartType",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("size",XMLType.XSD_STRING,ParameterMode.IN);
            // 方法的返回值类型            
            call.setReturnType(XMLType.XSD_STRING);
                               
            //设置参数
            String layername = gisChartInfo.getLayername();
        int width = gisChartInfo.getWidth();
        int height = gisChartInfo.getHeight();
        String imageType = gisChartInfo.getImageType();
        String fieldnames = gisChartInfo.getFieldnames();
        String fieldvalues = gisChartInfo.getFieldvalues();
        String rgbcolors = gisChartInfo.getRgbcolors();
        String chartType = gisChartInfo.getChartType();
        String size = gisChartInfo.getSize();
       
        Object[] parameters = new Object[]{layername,width+"",height+"",imageType,fieldnames,fieldvalues,rgbcolors,chartType,size};        
        // 调用该方法
        byte[] imageBytes ;
        BASE64Decoder dec=new BASE64Decoder();
        imageBytes = dec.decodeBuffer(call.invoke(parameters).toString());
        System.out.println(imageBytes);
            //在指定位置生成图片
            Date date = new Date();
            picUrl = imagePath+date.getTime()+"."+gisChartInfo.getImageType();  
FileOutputStream out = new FileOutputStream(picUrl);
System.out.println(imageBytes.length);
out.write(imageBytes ,0,imageBytes.length);   
out.flush();
out.close();
        } catch (RemoteException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (MalformedURLException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }catch (ServiceException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();
        }catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
        }
      
        return picUrl;  
    } 

public static void main(String args[]){
GisChartInfo gisChartInfo = new GisChartInfo();
gisChartInfo.setLayername("地市行政区划");
gisChartInfo.setWidth(800);
gisChartInfo.setHeight(800);
gisChartInfo.setImageType("JPG");
gisChartInfo.setFieldnames("行政区划代码,县道,乡道,村道,专用道路");
gisChartInfo.setFieldvalues("3501,1791.561,2327.151,4659.821,9.656;" +
"3502,493.664,665.151,405.498,0;" +
"3503,676.446,981.887,3266.88,3.095;" +
"3504,1846.326,6357.708,3388.415,0;" +
"3505,1966.458,6469.783,4600.375,1.461;" +
"3506,1692.84,3526.773,3656.503,0;" +
"3507,1541.45,6636.189,3572.128,99.667;" +
"3508,1797.244,6723.257,1750.648,296.853;" +
"3509,1725.352,1903.754,4550.091,58.943");
gisChartInfo.setRgbcolors("0,92,230;132,0,128;56,168,0;255,128,0");
gisChartInfo.setChartType("BAR");
gisChartInfo.setSize("30,10");
System.out.println(new GetWebService().getWebService("d:/GisPictures/", gisChartInfo));

}


}



下面是接口描述文档
Java 代码
  1. POST /JttMapService/Service.asmx HTTP/ 1.1   
  2. Host: 192.168 . 5.92   
  3. Content-Type: text/xml; charset=utf-8   
  4. Content-Length: length  
  5. SOAPAction: "http://www.fzkcy.com/WebChartNew"   
  6.   
  7. <?xml version="1.0"  encoding= "utf-8" ?>  
  8. <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd= "http://www.w3.org/2001/XMLSchema"  xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" >  
  9.   <soap:Body>  
  10.     <WebChartNew xmlns="http://www.fzkcy.com/" >  
  11.       <layername>string</layername>  
  12.       <width>int </width>  
  13.       <height>int </height>  
  14.       <imageType>string</imageType>  
  15.       <fieldnames>string</fieldnames>  
  16.       <fieldvalues>string</fieldvalues>  
  17.       <rgbcolors>string</rgbcolors>  
  18.       <chartType>string</chartType>  
  19.       <size>string</size>  
  20.     </WebChartNew>  
  21.   </soap:Body>  
  22. </soap:Envelope>  
  23. HTTP/1.1   200  OK  
  24. Content-Type: text/xml; charset=utf-8   
  25. Content-Length: length  
  26.   
  27. <?xml version="1.0"  encoding= "utf-8" ?>  
  28. <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd= "http://www.w3.org/2001/XMLSchema"  xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" >  
  29.   <soap:Body>  
  30.     <WebChartNewResponse xmlns="http://www.fzkcy.com/" >  
  31.       <WebChartNewResult>base64Binary</WebChartNewResult>  
  32.     </WebChartNewResponse>  
  33.   </soap:Body>  
  34. </soap:Envelope>  
POST /JttMapService/Service.asmx HTTP/1.1
Host: 192.168.5.92
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.fzkcy.com/WebChartNew"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <WebChartNew xmlns="http://www.fzkcy.com/">
      <layername>string</layername>
      <width>int</width>
      <height>int</height>
      <imageType>string</imageType>
      <fieldnames>string</fieldnames>
      <fieldvalues>string</fieldvalues>
      <rgbcolors>string</rgbcolors>
      <chartType>string</chartType>
      <size>string</size>
    </WebChartNew>
  </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <WebChartNewResponse xmlns="http://www.fzkcy.com/">
      <WebChartNewResult>base64Binary</WebChartNewResult>
    </WebChartNewResponse>
  </soap:Body>
</soap:Envelope>




其中需要注意的是 java 在接受. netwebservice 方法返回的是经过base64编码方式编码过的字符串,接收时需要将它转换为byte[]再生成图片。
还有一点我没搞明白的,也困扰我很久的就是. net 的接口描述文档中的参数 width和height是int类型,当我传入int类型时服务器会报错:Server was unable to read request。就是服务器无法读取请求。最后通过把这两个值转换为String类型传入解决问题,但原因还没搞清楚,希望那位是过来人的仁兄留言解释一 下,不胜感激!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值