好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java如何实现post请求webservice服务端

post请求webservice服务端

当生成webService的客户端不好实现时,通过java的post请求不失为一种好办法。

1.例如我此时有一个wsdl文件

?

1

http: //xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl

2.通过SoapUI 我们可以将swdl文件转换。从而模拟发送请求。以及参数

(不懂soapui请自行百度)

2.点击row查看具体的发送参数

具体参数对应规则( 以下对应代码上应该发送的参数是什么)

3.代码实现

?

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

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 );

           //允许对外输出数据

           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" );

               //发送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参数说明

url :这个地址即wsdl文件地址去掉后缀  [?wsdl]。如此例就是: wsdl :

?

1

http: //xxx.xxx.xxx.xxx:8081/APIService.svc?wsdl

url :

?

1

http: //xxx.xxx.xxx.xxx:8081/APIService.svc

params :这个即是请求的参数 host :这个是对方的主机地址和端口号。 如此例为:  xxx.xxx.xxx.xxx:8081 SOAPAction :具体service路径

用post请求调用webservice

先说下遇到的坑,最先用post请求的时候一直返回500的错误码

最终通过打印错误信息分析,请求头必须添加SOAPAction

?

1

2

//请求头必须设置SOAPAction

connection.setRequestProperty( "SOAPAction" , "application/soap+xml; charset=utf-8" ); 

xml转json需要用到hutool-all-4.0.12.jar,解析json比xml要简单得多。

如果不需要用xml转json,除需要jdk自带的包不再需要引入其他的包。

?

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

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

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 {

 

     /**

      * 发送http post调用webservice

      *

      * @param strUrl

      * @param requestSoapXml

      * @return

      * @throws IOException

      */

     public static String soapPost(String strUrl, String requestSoapXml) throws IOException {

         //第一步:创建服务地址,不是WSDL地址

         URL url = new URL(strUrl);

         //第二步:打开一个通向服务地址的连接

         HttpURLConnection connection = (HttpURLConnection) url.openConnection();

         //第三步:设置参数

         //3.1发送方式设置:POST必须大写

         connection.setRequestMethod( "POST" );

         //3.2设置数据格式:content-type

         connection.setRequestProperty( "content-type" , "text/xml;charset=utf-8" );

         //3.3设置输入输出,因为默认新创建的connection没有读写权限,

         connection.setDoInput( true );

         connection.setDoOutput( true );

         //请求头必须设置SOAPAction

         connection.setRequestProperty( "SOAPAction" , "application/soap+xml; charset=utf-8" );

         //第四步:组织SOAP数据,发送请求

         OutputStream os = connection.getOutputStream();

         //os.write(requestSoapXml.getBytes());这个方法遇到一个大坑记录下

         //当时在开发工具中通过这个方法调用接口一切都OK,但是放到客户服务器上发送post

         //请求就返回500错误,错误信息太少,走了很多弯路,百度无果后,

         //后面灵机一动,会不会是传输的数据编码不对,

         //导致接口服务端解析请求数据报错从而返回500错误码,

         //其实我是不知道服务端到底用的什么编码,

         //经过尝试 os.write(requestSoapXml.getBytes("utf-8"));

         //结果成功了,根据实际情况这个编码会改动

         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失败:服务器端返回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\":\"服务器\",\"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();

        }

     }

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/luChenH/article/details/94456879

查看更多关于java如何实现post请求webservice服务端的详细内容...

  阅读:42次