java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端
post請(qǐng)求webservice服務(wù)端
當(dāng)生成webService的客戶端不好實(shí)現(xiàn)時(shí),通過java的post請(qǐng)求不失為一種好辦法。
1.例如我此時(shí)有一個(gè)wsdl文件
http://xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl
2.通過SoapUI 我們可以將swdl文件轉(zhuǎn)換。從而模擬發(fā)送請(qǐng)求。以及參數(shù)
(不懂soapui請(qǐng)自行百度)
2.點(diǎn)擊row查看具體的發(fā)送參數(shù)
具體參數(shù)對(duì)應(yīng)規(guī)則(以下對(duì)應(yīng)代碼上應(yīng)該發(fā)送的參數(shù)是什么)
3.代碼實(shí)現(xiàn)
public static void main(String[] args) { try{ String url="http://xxx.xxx.xxx.xxx:8081/APIService.svc"; String params="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\" xmlns:hn=\"http://schemas.datacontract.org/2004/07/hn.DataAccess.bll\">\n" + " </tem:input>\n" + " </soapenv:Body>\n" + "</soapenv:Envelope>"; String host="xxx.xxx.xxx.xxx:8081"; String SOAPAction="http://aaa/aaa/aaa"; //接受返回報(bào)文 String result = new String(); URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection) u.openConnection(); conn.setDoInput(true); //允許對(duì)外輸出數(shù)據(jù) conn.setDoOutput(true); conn.setUseCaches(false); conn.setDefaultUseCaches(false); conn.setRequestProperty("Host",host); conn.setRequestProperty("Content-Type","text/xml;charset=UTF-8"); //soap conn.setRequestProperty("SOAPAction",SOAPAction); conn.setRequestProperty("Content-Length",String.valueOf(params.length())); conn.setRequestMethod("POST"); //定義輸出流 OutputStream output = conn.getOutputStream(); if(StringUtils.isNotBlank(params)){ byte[] b = params.getBytes("UTF-8"); //發(fā)送soap請(qǐng)求報(bào)文 output.write(b,0,b.length); output.flush(); output.close(); //定義輸入流,獲取soap報(bào)文 InputStream input = conn.getInputStream(); //設(shè)置編碼格式 result = IOUtils.toString(input,"UTF-8"); input.close(); } System.out.println("請(qǐng)求返回報(bào)文:" + result); }catch (Exception e){ System.out.println(e.getMessage()); } }
3.1參數(shù)說明
url
:這個(gè)地址即wsdl文件地址去掉后綴 “?wsdl”。如此例就是:wsdl
:
http://xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl
url
:
http://xxx.xxx.xxx.xxx:8081/APIService.svc
params
:這個(gè)即是請(qǐng)求的參數(shù)host
:這個(gè)是對(duì)方的主機(jī)地址和端口號(hào)。 如此例為: xxx.xxx.xxx.xxx:8081SOAPAction
:具體service路徑
用post請(qǐng)求調(diào)用webservice
先說下遇到的坑,最先用post請(qǐng)求的時(shí)候一直返回500的錯(cuò)誤碼
最終通過打印錯(cuò)誤信息分析,請(qǐng)求頭必須添加SOAPAction
//請(qǐng)求頭必須設(shè)置SOAPAction connection.setRequestProperty("SOAPAction","application/soap+xml; charset=utf-8");?
xml轉(zhuǎn)json需要用到hutool-all-4.0.12.jar,解析json比xml要簡(jiǎn)單得多。
如果不需要用xml轉(zhuǎn)json,除需要jdk自帶的包不再需要引入其他的包。
package com.baidu.util; import cn.hutool.json.XML; import net.sf.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @author 藍(lán)珂一劍 * @version 1.0.0 * @ClassName SoapUtil.java * @Description webservice調(diào)用工具類 * @createTime 2020/9/29 10:37 */ public class SoapUtil { /** * 發(fā)送http post調(diào)用webservice * * @param strUrl * @param requestSoapXml * @return * @throws IOException */ public static String soapPost(String strUrl, String requestSoapXml) throws IOException { //第一步:創(chuàng)建服務(wù)地址,不是WSDL地址 URL url = new URL(strUrl); //第二步:打開一個(gè)通向服務(wù)地址的連接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:設(shè)置參數(shù) //3.1發(fā)送方式設(shè)置:POST必須大寫 connection.setRequestMethod("POST"); //3.2設(shè)置數(shù)據(jù)格式:content-type connection.setRequestProperty("content-type", "text/xml;charset=utf-8"); //3.3設(shè)置輸入輸出,因?yàn)槟J(rèn)新創(chuàng)建的connection沒有讀寫權(quán)限, connection.setDoInput(true); connection.setDoOutput(true); //請(qǐng)求頭必須設(shè)置SOAPAction connection.setRequestProperty("SOAPAction","application/soap+xml; charset=utf-8"); //第四步:組織SOAP數(shù)據(jù),發(fā)送請(qǐng)求 OutputStream os = connection.getOutputStream(); //os.write(requestSoapXml.getBytes());這個(gè)方法遇到一個(gè)大坑記錄下 //當(dāng)時(shí)在開發(fā)工具中通過這個(gè)方法調(diào)用接口一切都OK,但是放到客戶服務(wù)器上發(fā)送post //請(qǐng)求就返回500錯(cuò)誤,錯(cuò)誤信息太少,走了很多彎路,百度無果后, //后面靈機(jī)一動(dòng),會(huì)不會(huì)是傳輸?shù)臄?shù)據(jù)編碼不對(duì), //導(dǎo)致接口服務(wù)端解析請(qǐng)求數(shù)據(jù)報(bào)錯(cuò)從而返回500錯(cuò)誤碼, //其實(shí)我是不知道服務(wù)端到底用的什么編碼, //經(jīng)過嘗試 os.write(requestSoapXml.getBytes("utf-8")); //結(jié)果成功了,根據(jù)實(shí)際情況這個(gè)編碼會(huì)改動(dòng) os.write(requestSoapXml.getBytes()); //第五步:接收服務(wù)端響應(yīng),打印 int responseCode = connection.getResponseCode(); //==============打印錯(cuò)誤信息 // try{ // InputStream iss = connection.getErrorStream(); //通過getErrorStream了解錯(cuò)誤的詳情 // InputStreamReader isrs = new InputStreamReader(iss,"utf-8"); // BufferedReader ins = new BufferedReader(isrs); // String inputLine; // BufferedWriter bws = new BufferedWriter(new OutputStreamWriter( // new FileOutputStream("result.xml")));// 將結(jié)果存放的位置 // while ((inputLine = ins.readLine()) != null) // { // System.out.println(inputLine); // bws.write(inputLine); // bws.newLine(); // // } // bws.close(); // }catch (Exception e){ // // } //============== StringBuilder sb = new StringBuilder(); if (200 == responseCode) {//表示服務(wù)端響應(yīng)成功 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String temp = null; while (null != (temp = br.readLine())) { sb.append(temp); } is.close(); isr.close(); br.close(); }else{ throw new RuntimeException("調(diào)用webservice失敗:服務(wù)器端返回HTTP code " + responseCode + "信息:" ); } os.close(); return sb.toString(); } public static void main(String[] args) { String url = "http://192.168.100.86:6888/ormrpc/services/WSImpExtFaCardFacade"; String p = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.app.manage.fa.fi.eas.kingdee.com\">\n" + " <soapenv:Header/>\n" + " <soapenv:Body>\n" + " <web:impFaCard soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" + " <jsonStr xsi:type=\"xsd:string\">{\"header\":{\"bizcode\":\"42AC39EC\",\"bizdate\":\"2020-10-12\"},\"datas\":[{\"companynum\":\"D01\",\"facatnum\":\"04\",\"number\":\"JD04202010120000175\",\"oldnumber\":\"\",\"assetname\":\"服務(wù)器\",\"assetamount\":\"1\",\"measureunitnum\":\"件\",\"recorddate\":\"2020-10-12\",\"fiaccountdate\":\"2020-10-12\",\"originnum\":\"00101\",\"fausestatusnum\":\"101\",\"economypurposenum\":\"001\",\"storecitynum\":\"001\",\"specs\":\" \",\"parea\":\"\",\"manufacturer\":\"\",\"leavefactorydate\":\"\",\"paperno\":\"\",\"fromunit\":\"-1\",\"deptnum\":\"JD.001\",\"keepernum\":\"EP17019484\",\"remark\":\"\",\"currencynum\":\"BB01\",\"exchangerate\":\"1\",\"originalamount\":\"12000.0\",\"additiveamount\":\"0\",\"localamount\":\"12000.0\",\"inputtax\":\"0\",\"fairvalue\":\"0\",\"buyoriginalvalue\":\"0\",\"buyaddupdep\":\"0\",\"treatmentincome\":\"0\",\"deliverdate\":\"\",\"startdate\":\"2020-10-12\",\"expuseyears\":\"5\",\"expuseperiod\":\"60\",\"depperiod\":\"0\",\"addupdep\":\"0\",\"neatleftrate\":\"0\",\"expneatleftvalue\":\"3600.0\",\"neatvalue\":\"12000.0\",\"addupdepthisyear\":\"0\",\"decprepare\":\"0\",\"neatamount\":\"12000.0\",\"deprmethodnum\":\"0\",\"measureunitwlnum\":\"\",\"accountassetsnum\":\"04\",\"accountaccudeprnum\":\"04\",\"accountdecvaluenum\":\"04\",\"initevalvalue\":\"0\",\"evalperiodleft\":\"0\",\"accudeprall\":\"0\",\"hasdisabled\":\"0\",\"addonfare\":\"0\",\"monthrate\":\"0\",\"wrtyperiod\":\"\",\"wrtynumber\":\"\",\"groupnumber\":\"\",\"barcode\":\"JD04202010120000175\",\"usedepartmentnum\":\"JD.001\",\"usepersonnum\":\"\",\"usage\":\"\",\"asstacttypenum\":\"CBZX\",\"asstactitemnum\":\"Y0101\",\"accountnum\":\"6602.05\",\"apportionscale\":\"100\"},{\"companynum\":\"D01\",\"facatnum\":\"04\",\"number\":\"JD04202010120000176\",\"oldnumber\":\"\",\"assetname\":\"服務(wù)器\",\"assetamount\":\"1\",\"measureunitnum\":\"件\",\"recorddate\":\"2020-10-12\",\"fiaccountdate\":\"2020-10-12\",\"originnum\":\"00101\",\"fausestatusnum\":\"101\",\"economypurposenum\":\"001\",\"storecitynum\":\"001\",\"specs\":\" \",\"parea\":\"\",\"manufacturer\":\"\",\"leavefactorydate\":\"\",\"paperno\":\"\",\"fromunit\":\"-1\",\"deptnum\":\"JD.001\",\"keepernum\":\"EP17019484\",\"remark\":\"\",\"currencynum\":\"BB01\",\"exchangerate\":\"1\",\"originalamount\":\"12000.0\",\"additiveamount\":\"0\",\"localamount\":\"12000.0\",\"inputtax\":\"0\",\"fairvalue\":\"0\",\"buyoriginalvalue\":\"0\",\"buyaddupdep\":\"0\",\"treatmentincome\":\"0\",\"deliverdate\":\"\",\"startdate\":\"2020-10-12\",\"expuseyears\":\"5\",\"expuseperiod\":\"60\",\"depperiod\":\"0\",\"addupdep\":\"0\",\"neatleftrate\":\"0\",\"expneatleftvalue\":\"3600.0\",\"neatvalue\":\"12000.0\",\"addupdepthisyear\":\"0\",\"decprepare\":\"0\",\"neatamount\":\"12000.0\",\"deprmethodnum\":\"0\",\"measureunitwlnum\":\"\",\"accountassetsnum\":\"04\",\"accountaccudeprnum\":\"04\",\"accountdecvaluenum\":\"04\",\"initevalvalue\":\"0\",\"evalperiodleft\":\"0\",\"accudeprall\":\"0\",\"hasdisabled\":\"0\",\"addonfare\":\"0\",\"monthrate\":\"0\",\"wrtyperiod\":\"\",\"wrtynumber\":\"\",\"groupnumber\":\"\",\"barcode\":\"JD04202010120000176\",\"usedepartmentnum\":\"JD.001\",\"usepersonnum\":\"\",\"usage\":\"\",\"asstacttypenum\":\"CBZX\",\"asstactitemnum\":\"Y0101\",\"accountnum\":\"6602.05\",\"apportionscale\":\"100\"},{\"companynum\":\"D01\",\"facatnum\":\"04\",\"number\":\"JD04202010120000177\",\"oldnumber\":\"\",\"assetname\":\"服務(wù)器\",\"assetamount\":\"1\",\"measureunitnum\":\"件\",\"recorddate\":\"2020-10-12\",\"fiaccountdate\":\"2020-10-12\",\"originnum\":\"00101\",\"fausestatusnum\":\"101\",\"economypurposenum\":\"001\",\"storecitynum\":\"001\",\"specs\":\" \",\"parea\":\"\",\"manufacturer\":\"\",\"leavefactorydate\":\"\",\"paperno\":\"\",\"fromunit\":\"-1\",\"deptnum\":\"JD.001\",\"keepernum\":\"EP17019484\",\"remark\":\"\",\"currencynum\":\"BB01\",\"exchangerate\":\"1\",\"originalamount\":\"12000.0\",\"additiveamount\":\"0\",\"localamount\":\"12000.0\",\"inputtax\":\"0\",\"fairvalue\":\"0\",\"buyoriginalvalue\":\"0\",\"buyaddupdep\":\"0\",\"treatmentincome\":\"0\",\"deliverdate\":\"\",\"startdate\":\"2020-10-12\",\"expuseyears\":\"5\",\"expuseperiod\":\"60\",\"depperiod\":\"0\",\"addupdep\":\"0\",\"neatleftrate\":\"0\",\"expneatleftvalue\":\"3600.0\",\"neatvalue\":\"12000.0\",\"addupdepthisyear\":\"0\",\"decprepare\":\"0\",\"neatamount\":\"12000.0\",\"deprmethodnum\":\"0\",\"measureunitwlnum\":\"\",\"accountassetsnum\":\"04\",\"accountaccudeprnum\":\"04\",\"accountdecvaluenum\":\"04\",\"initevalvalue\":\"0\",\"evalperiodleft\":\"0\",\"accudeprall\":\"0\",\"hasdisabled\":\"0\",\"addonfare\":\"0\",\"monthrate\":\"0\",\"wrtyperiod\":\"\",\"wrtynumber\":\"\",\"groupnumber\":\"\",\"barcode\":\"JD04202010120000177\",\"usedepartmentnum\":\"JD.001\",\"usepersonnum\":\"\",\"usage\":\"\",\"asstacttypenum\":\"CBZX\",\"asstactitemnum\":\"Y0101\",\"accountnum\":\"6602.05\",\"apportionscale\":\"100\"},{\"companynum\":\"D01\",\"facatnum\":\"04\",\"number\":\"JD04202010120000178\",\"oldnumber\":\"\",\"assetname\":\"服務(wù)器\",\"assetamount\":\"1\",\"measureunitnum\":\"件\",\"recorddate\":\"2020-10-12\",\"fiaccountdate\":\"2020-10-12\",\"originnum\":\"00101\",\"fausestatusnum\":\"101\",\"economypurposenum\":\"001\",\"storecitynum\":\"001\",\"specs\":\" \",\"parea\":\"\",\"manufacturer\":\"\",\"leavefactorydate\":\"\",\"paperno\":\"\",\"fromunit\":\"-1\",\"deptnum\":\"JD.001\",\"keepernum\":\"EP17019484\",\"remark\":\"\",\"currencynum\":\"BB01\",\"exchangerate\":\"1\",\"originalamount\":\"12000.0\",\"additiveamount\":\"0\",\"localamount\":\"12000.0\",\"inputtax\":\"0\",\"fairvalue\":\"0\",\"buyoriginalvalue\":\"0\",\"buyaddupdep\":\"0\",\"treatmentincome\":\"0\",\"deliverdate\":\"\",\"startdate\":\"2020-10-12\",\"expuseyears\":\"5\",\"expuseperiod\":\"60\",\"depperiod\":\"0\",\"addupdep\":\"0\",\"neatleftrate\":\"0\",\"expneatleftvalue\":\"3600.0\",\"neatvalue\":\"12000.0\",\"addupdepthisyear\":\"0\",\"decprepare\":\"0\",\"neatamount\":\"12000.0\",\"deprmethodnum\":\"0\",\"measureunitwlnum\":\"\",\"accountassetsnum\":\"04\",\"accountaccudeprnum\":\"04\",\"accountdecvaluenum\":\"04\",\"initevalvalue\":\"0\",\"evalperiodleft\":\"0\",\"accudeprall\":\"0\",\"hasdisabled\":\"0\",\"addonfare\":\"0\",\"monthrate\":\"0\",\"wrtyperiod\":\"\",\"wrtynumber\":\"\",\"groupnumber\":\"\",\"barcode\":\"JD04202010120000178\",\"usedepartmentnum\":\"JD.001\",\"usepersonnum\":\"\",\"usage\":\"\",\"asstacttypenum\":\"CBZX\",\"asstactitemnum\":\"Y0101\",\"accountnum\":\"6602.05\",\"apportionscale\":\"100\"},{\"companynum\":\"D01\",\"facatnum\":\"04\",\"number\":\"JD04202010120000179\",\"oldnumber\":\"\",\"assetname\":\"服務(wù)器\",\"assetamount\":\"1\",\"measureunitnum\":\"件\",\"recorddate\":\"2020-10-12\",\"fiaccountdate\":\"2020-10-12\",\"originnum\":\"00101\",\"fausestatusnum\":\"101\",\"economypurposenum\":\"001\",\"storecitynum\":\"001\",\"specs\":\" \",\"parea\":\"\",\"manufacturer\":\"\",\"leavefactorydate\":\"\",\"paperno\":\"\",\"fromunit\":\"-1\",\"deptnum\":\"JD.001\",\"keepernum\":\"EP17019484\",\"remark\":\"\",\"currencynum\":\"BB01\",\"exchangerate\":\"1\",\"originalamount\":\"12000.0\",\"additiveamount\":\"0\",\"localamount\":\"12000.0\",\"inputtax\":\"0\",\"fairvalue\":\"0\",\"buyoriginalvalue\":\"0\",\"buyaddupdep\":\"0\",\"treatmentincome\":\"0\",\"deliverdate\":\"\",\"startdate\":\"2020-10-12\",\"expuseyears\":\"5\",\"expuseperiod\":\"60\",\"depperiod\":\"0\",\"addupdep\":\"0\",\"neatleftrate\":\"0\",\"expneatleftvalue\":\"3600.0\",\"neatvalue\":\"12000.0\",\"addupdepthisyear\":\"0\",\"decprepare\":\"0\",\"neatamount\":\"12000.0\",\"deprmethodnum\":\"0\",\"measureunitwlnum\":\"\",\"accountassetsnum\":\"04\",\"accountaccudeprnum\":\"04\",\"accountdecvaluenum\":\"04\",\"initevalvalue\":\"0\",\"evalperiodleft\":\"0\",\"accudeprall\":\"0\",\"hasdisabled\":\"0\",\"addonfare\":\"0\",\"monthrate\":\"0\",\"wrtyperiod\":\"\",\"wrtynumber\":\"\",\"groupnumber\":\"\",\"barcode\":\"JD04202010120000179\",\"usedepartmentnum\":\"JD.001\",\"usepersonnum\":\"\",\"usage\":\"\",\"asstacttypenum\":\"CBZX\",\"asstactitemnum\":\"Y0101\",\"accountnum\":\"6602.05\",\"apportionscale\":\"100\"}]}</jsonStr>\n" + " </web:impFaCard>\n" + " </soapenv:Body>\n" + "</soapenv:Envelope>"; try{ String response = SoapUtil.soapPost(url,p); cn.hutool.json.JSONObject data = XML.toJSONObject(response); //從data中解析rescode和resmsg,其中"rescode"為0時(shí)代表成功,其他均為失敗。 String resMsg = data.getJSONObject("soapenv:Envelope").getJSONObject("soapenv:Body").getJSONObject("ns1:impFaCardResponse").getJSONObject("impFaCardReturn").getStr("content"); JSONObject jsonObject = JSONObject.fromObject(resMsg); String bizcode = jsonObject.getString("bizcode"); String bizdate = jsonObject.getString("bizdate"); String rescode = jsonObject.getString("rescode"); String resmsg = jsonObject.getString("resmsg"); System.out.println(resmsg); }catch (Exception e){ e.printStackTrace(); } } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?限制前端重復(fù)請(qǐng)求的實(shí)例代碼
這篇文章主要介紹了Java?限制前端重復(fù)請(qǐng)求,文中給大家提到了JAVA利用自定義本地鎖解決重復(fù)提交的問題,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解
項(xiàng)目開發(fā)過程中,很大的需求都有 導(dǎo)入導(dǎo)出功能。本文將利用SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出功能,感興趣的可以了解一下2022-08-08Spring中@ConfigurationProperties的用法解析
這篇文章主要介紹了Spring中@ConfigurationProperties的用法解析,傳統(tǒng)的Spring一般都是基本xml配置的,后來spring3.0新增了許多java config的注解,特別是spring boot,基本都是清一色的java config,需要的朋友可以參考下2023-11-11復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java中IO流簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java io系統(tǒng)的設(shè)計(jì)初衷,就是為了實(shí)現(xiàn)“文件、控制臺(tái)、網(wǎng)絡(luò)設(shè)備”這些io設(shè)置的通信。接下來通過本文給大家介紹Java中IO流簡(jiǎn)介,感興趣的朋友一起看看吧2017-05-05不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析
這篇文章主要為大家介紹了不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09