java如何實現(xiàn)post請求webservice服務端
post請求webservice服務端
當生成webService的客戶端不好實現(xiàn)時,通過java的post請求不失為一種好辦法。
1.例如我此時有一個wsdl文件
http://xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl
2.通過SoapUI 我們可以將swdl文件轉換。從而模擬發(fā)送請求。以及參數(shù)
(不懂soapui請自行百度)

2.點擊row查看具體的發(fā)送參數(shù)

具體參數(shù)對應規(guī)則(以下對應代碼上應該發(fā)送的參數(shù)是什么)

3.代碼實現(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";
//接受返回報文
String result = new String();
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoInput(true);
//允許對外輸出數(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請求報文
output.write(b,0,b.length);
output.flush();
output.close();
//定義輸入流,獲取soap報文
InputStream input = conn.getInputStream();
//設置編碼格式
result = IOUtils.toString(input,"UTF-8");
input.close();
}
System.out.println("請求返回報文:" + result);
}catch (Exception e){
System.out.println(e.getMessage());
}
}3.1參數(shù)說明
url:這個地址即wsdl文件地址去掉后綴 “?wsdl”。如此例就是:wsdl:
http://xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl
url:
http://xxx.xxx.xxx.xxx:8081/APIService.svc
params:這個即是請求的參數(shù)host:這個是對方的主機地址和端口號。 如此例為: xxx.xxx.xxx.xxx:8081SOAPAction:具體service路徑
用post請求調用webservice
先說下遇到的坑,最先用post請求的時候一直返回500的錯誤碼
最終通過打印錯誤信息分析,請求頭必須添加SOAPAction
//請求頭必須設置SOAPAction
connection.setRequestProperty("SOAPAction","application/soap+xml; charset=utf-8");?xml轉json需要用到hutool-all-4.0.12.jar,解析json比xml要簡單得多。
如果不需要用xml轉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 藍珂一劍
* @version 1.0.0
* @ClassName SoapUtil.java
* @Description webservice調用工具類
* @createTime 2020/9/29 10:37
*/
public class SoapUtil {
/**
* 發(fā)送http post調用webservice
*
* @param strUrl
* @param requestSoapXml
* @return
* @throws IOException
*/
public static String soapPost(String strUrl, String requestSoapXml) throws IOException {
//第一步:創(chuàng)建服務地址,不是WSDL地址
URL url = new URL(strUrl);
//第二步:打開一個通向服務地址的連接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//第三步:設置參數(shù)
//3.1發(fā)送方式設置:POST必須大寫
connection.setRequestMethod("POST");
//3.2設置數(shù)據(jù)格式:content-type
connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
//3.3設置輸入輸出,因為默認新創(chuàng)建的connection沒有讀寫權限,
connection.setDoInput(true);
connection.setDoOutput(true);
//請求頭必須設置SOAPAction
connection.setRequestProperty("SOAPAction","application/soap+xml; charset=utf-8");
//第四步:組織SOAP數(shù)據(jù),發(fā)送請求
OutputStream os = connection.getOutputStream();
//os.write(requestSoapXml.getBytes());這個方法遇到一個大坑記錄下
//當時在開發(fā)工具中通過這個方法調用接口一切都OK,但是放到客戶服務器上發(fā)送post
//請求就返回500錯誤,錯誤信息太少,走了很多彎路,百度無果后,
//后面靈機一動,會不會是傳輸?shù)臄?shù)據(jù)編碼不對,
//導致接口服務端解析請求數(shù)據(jù)報錯從而返回500錯誤碼,
//其實我是不知道服務端到底用的什么編碼,
//經過嘗試 os.write(requestSoapXml.getBytes("utf-8"));
//結果成功了,根據(jù)實際情況這個編碼會改動
os.write(requestSoapXml.getBytes());
//第五步:接收服務端響應,打印
int responseCode = connection.getResponseCode();
//==============打印錯誤信息
// try{
// InputStream iss = connection.getErrorStream(); //通過getErrorStream了解錯誤的詳情
// InputStreamReader isrs = new InputStreamReader(iss,"utf-8");
// BufferedReader ins = new BufferedReader(isrs);
// String inputLine;
// BufferedWriter bws = new BufferedWriter(new OutputStreamWriter(
// new FileOutputStream("result.xml")));// 將結果存放的位置
// 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) {//表示服務端響應成功
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("調用webservice失?。悍掌鞫朔祷豀TTP 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\":\"服務器\",\"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\":\"服務器\",\"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\":\"服務器\",\"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\":\"服務器\",\"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\":\"服務器\",\"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時代表成功,其他均為失敗。
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();
}
}
}以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot+Vue實現(xiàn)EasyPOI導入導出的方法詳解
項目開發(fā)過程中,很大的需求都有 導入導出功能。本文將利用SpringBoot+Vue實現(xiàn)EasyPOI導入導出功能,感興趣的可以了解一下2022-08-08
Spring中@ConfigurationProperties的用法解析
這篇文章主要介紹了Spring中@ConfigurationProperties的用法解析,傳統(tǒng)的Spring一般都是基本xml配置的,后來spring3.0新增了許多java config的注解,特別是spring boot,基本都是清一色的java config,需要的朋友可以參考下2023-11-11
不寫mybatis的@Param有的報錯有的卻不報錯問題分析
這篇文章主要為大家介紹了不寫mybatis的@Param有的報錯有的卻不報錯問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09

