准备工作
定义测试的webservice及其中的方法
如何发布全新的webservice并测试,可以参考博客C# webservice 接口编写、发布与测试
方法体如下
1 2 3 4 5 | [WebMethod] public string testProcedure( string sInput) { return "执行时间:" + DateTime.Now.ToString() + sInput; } |
Oracle语句详情
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | -- 声明变量和数据类型 declare req utl_http.req; -- HTTP请求句柄 resp utl_http.resp; -- HTTP响应句柄 url varchar2(4000) := 'http://10.xx.xx.xx:8085/WebService.asmx' ; -- Web Service的URL地址 soap_env varchar2(4000); -- SOAP请求包体 buffer varchar2(32767); -- 字符串缓冲区 utf8_data clob; -- 存储UTF-8编码的CLOB数据类型(存储大量文本数据的数据类型) raw_data raw(32767); -- RAW数据类型,用于存储二进制数据 raw_buffer raw(32767); -- RAW类型的缓冲区 line varchar2(32767); -- 每行读取的数据 idx integer := 1; -- 循环索引变量 begin -- 构造SOAP请求包体 soap_env := '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">' || '<soap:Header/>' || -- SOAP头,这里为空 '<soap:Body>' || -- SOAP主体开始 ' <tem:testProcedure>' || -- 调用Web Service的方法名 ' <tem:sInput>' || -- 方法参数开始 ' testConnect + 中文test' || -- 参数值,包括英文和中文字符 '</tem:sInput>' || -- 方法参数结束 ' </tem:testProcedure>' || -- 方法调用结束 '</soap:Body>' || -- SOAP主体结束 '</soap:Envelope>' ; -- SOAP包体结束 -- 开始发起HTTP POST请求,如果此部分存在疑问,请自行寻找前端请求报文相关内容学习。 req := utl_http.begin_request(url, 'POST' , 'HTTP/1.1' ); -- 初始化HTTP请求 utl_http.set_header(req, 'Content-Type' , 'application/soap+xml; charset=utf-8' ); -- 设置Content-Type头部 utl_http.set_header(req, 'Content-Length' , length(soap_env)); -- 设置Content-Length头部 utl_http.write_text(req, soap_env); -- 写入SOAP请求包体到HTTP请求 -- 获取HTTP响应 resp := utl_http.get_response(req); -- 获取HTTP响应句柄 dbms_lob.createtemporary(utf8_data, true ); -- 创建临时CLOB变量用于存储响应数据 -- 循环读取HTTP响应体 loop begin utl_http.read_raw(resp, raw_buffer, 32767); -- 读取响应体到RAW缓冲区 dbms_lob.writeappend(utf8_data, -- 将RAW缓冲区的数据追加到CLOB中 utl_raw.length(raw_buffer), -- 数据长度 utl_raw.cast_to_varchar2(raw_buffer)); -- 将RAW转换为VARCHAR2再写入CLOB exception when utl_http.end_of_body then exit; -- 如果到达响应体结尾,则退出循环 when others then dbms_output.put_line( '在读取响应时发生错误: ' || sqlerrm); -- 其他异常处理 exit; -- 退出循环 end ; end loop; utl_http.end_response(resp); -- 结束HTTP响应 -- 循环读取并打印CLOB中的内容 idx := 1; while idx <= dbms_lob.getlength(utf8_data) loop line := dbms_lob.substr(utf8_data, 255, idx); -- 从CLOB中读取一行数据 dbms_output.put_line(line); -- 打印读取的一行数据 idx := idx + 255; -- 更新索引 end loop; dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间 exception when utl_http.end_of_body then utl_http.end_response(resp); -- 异常处理:如果到达响应体结尾,确保关闭HTTP响应 when others then dbms_output.put_line( '在调用Web服务时发生错误: ' || sqlerrm); -- 其他异常处理 if dbms_lob.istemporary(utf8_data) = 1 then 传参的中文会乱码,但是方法内部的中文不会乱码 dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间 end if; end ; / |
重要参数说明
上述程序已经解决了中文乱码的问题,但是还是不太完美,传参的中文会乱码,但是方法内部的中文不会乱码。
Web Service的URL地址
url varchar2(4000) := 'http://10.xx.xx.xx:8085/WebService.asmx';
构造SOAP请求包体
1 2 3 4 5 6 7 8 9 10 11 | soap_env := '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">' || '<soap:Header/>' || -- SOAP头,这里为空 '<soap:Body>' || -- SOAP主体开始 ' <tem:testProcedure>' || -- 调用Web Service的方法名 ' <tem:sInput>' || -- 方法参数开始 ' testConnect + 中文test' || -- 参数值,包括英文和中文字符 '</tem:sInput>' || -- 方法参数结束 ' </tem:testProcedure>' || -- 方法调用结束 '</soap:Body>' || -- SOAP主体结束 '</soap:Envelope>' ; -- SOAP包体结束 |
其中testProcedure
为webservice中定义的测试方法名,sInput
为方法的参数,多个参数,自行添加。标签<tem:sInput>
和</tem:sInput>
中间填写这个参数传的实际值,其余部分无需修改。
构造SOAP请求包体方法
我使用了soapui这个工具,怎么使用可以参考博客SoapUI 测试WebService接口可用性
依次如下操作即可:
如果需要把上面的功能变成function或者procedure,请自行搜索相关的方法实现即可。