HTTP post 请求携带xml格式报文请求接口

欢迎关注微信公众号: 程序员小圈圈
转载请标明出处^_^
原文首发于: www.zhangruibin.com
本文出自于: RebornChang的博客

厚颜打广告,博主个人博客地址传送门 ,欢迎来访

请求远程接口的方式有很多,规则也有很多,暴露接口的方式也有很多,这里简单的说下怎样使用http请求方式提交post请求,并且参数是以xml文本格式.
首先要确定这个接口能够使用xml格式参数请求成功,可以先用接口测试工具进行测验,工具比如Postman,soapUI等等,具体的接口工具安装使用教程这里就不多说了,网上一搜一大把的,那么接下来说下HTTP+POST+XML格式的请求代码思路:
1.将参数XML参数格式写在项目文件中,在封装参数的时候,先读取XML文件,然后根据获取到的参数进行请求报文的拼接.这种方式的优点是可维护性较好,但是过程比较繁琐.
2.使用stringbilder或者stringbuffer对请求报文进行拼接.这种方式比之前一种效率略高,但是维护性偏低.
所以选择哪种方式进行请求报文的拼接,因地制宜.
然后再简单说下HTTP请求的报文传输,传输的过程大致分为以下几步:
1:创建HTTP链接.HTTPpost请求方式,基于HTTP协议创建链接,三次握手啥的,具体的创建链接过程可参考书籍深入理解HTTP1.0;
2:传输报文.当链路传输建立之后,就是使用协议请求方式(比如post)进行报文的传输.报文的传输无疑是用流的方式进行传输的,请求方先在本地定义好请求的报文,然后以流的方式通过建立的管道传输给服务端,服务端拿到请求数据流之后,对这个流进行解析,然后根据请求报文流的内容作出自己不同的回应.
3:对相应报文进行解析.服务端给出的回应到了请求端后,请求端根据服务器端返回的报文内容作出自己的判断.
那么将这个步骤体现到java代码又是怎样的?博主po出来自己写的一个使用StringBuilder拼接报文的样例代码仅供参考,其中请求的URL接口写在配置文件中,然后使用java UTIL 包里面的propertie进行properties文件的解析,拿到远端的请求接口.具体的代码如下:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.regex.Pattern;

import com.ztesoft.sale.controller.login.LoginByAuthenUtils;

/**
 * 
 * @ClassName: HttpPostXml
 * @Description: TODO 使用http+post+xml方式访问远端接口
 * @author: zhrb
 * @date: 2018年7月6日 上午11:26:28 v1.0
 */
public class HttpPostXml {
	/**
	 * 
	 * @author:            zhrb
	 * @Title:             creatPostAndTransData
	 * @Description:       TODO
	 * @param:             @param dataMap,内含ip,disPhone,email
	 * @param:             @return   String 类型,string是请求接口返回的报文信息拼接的字符串
	 * @return:            String   
	 * @throws MalformedURLException,IOException
	 */
	public  String creatPostAndTransData(Map<String, Object> dataMap) {
		String urlStr = "";
		String line = "";
		StringBuffer resultSting = new StringBuffer();
		try {
			//urlStr,写在了配置文件中,直接进行获取
			urlStr = LoginByAuthenUtils.getECS010001Addr();
			//声明URL
			URL url = new URL(urlStr);
			//1.创建链接
			URLConnection con = url.openConnection();
			//2.封装报文传输进行传输
			//调用getXmlInfo(Map<String, Object> dataMap)进行报文的封装
			String xmlInfo = getXmlInfo(dataMap);
			byte[] xmlData = xmlInfo.getBytes();
			con.setDoOutput(true);   
			con.setDoInput(true);  
			con.setUseCaches(false); 
			con.setRequestProperty("Pragma:", "no-cache");
			con.setRequestProperty("Cache-Control", "no-cache");
			con.setRequestProperty("Content-Type", "text/xml");
			con.setRequestProperty("Content-length",String.valueOf(xmlData.length)); 
			OutputStreamWriter out = new OutputStreamWriter(
					con.getOutputStream());
			System.out.println(">>>>>>>>>>接口地址为urlStr=" + urlStr);
			System.out.println(">>>>>>>>>>传入的报文xmlInfo=" + xmlInfo);
			out.write(new String(xmlInfo.getBytes("ISO-8859-1")));
			out.flush();
			out.close();
			//3.获取返回报文
			BufferedReader br = new BufferedReader(new InputStreamReader(
					con.getInputStream()));
			//对返回值报文进行打印
			for (line = br.readLine(); line != null; line = br.readLine()) {
				//对返回的报文进行结果判断<RspCode>0000</RspCode>
				System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报文内容为:---------"+line);
				//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
				resultSting.append(line);
			}
			return resultSting.toString();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resultSting.toString();
	}
	/**
	 * 
	 * @author:            zhrb
	 * @Title:             getXmlInfo
	 * @Description:       TODO 接收数据,拼接生成请求报文
	 * @param:             @param dataMap,内含ip,disPhone,email
	 * @param:             @return   
	 * @return:            String   
	 * @throws
	 */
	private static String getXmlInfo(Map<String, Object> dataMap) {
		Date newDate = new Date();
		SimpleDateFormat smpDateFormat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
		String formatString = smpDateFormat.format(newDate);
		String platNo   = "";
		String timeStamp= "";
		String pid      = "";
		String ip       = "";
		String disPhone = "";
		String pwd      = "";
		String email    = "";
		platNo = "xxxx";
		timeStamp =formatString;	
		pid = "xx";
		//服务层传参,登录用户的ip地址
		ip = dataMap.get("ip").toString();
		//服务层传参,新增用户的手机号
		disPhone = dataMap.get("disPhone").toString();
		//pwd = dataMap.get("pwd").toString();
		//不传输,直接从配置文件中获取
		pwd = LoginByAuthenUtils.getDefultPwd();
		//服务层传参,新增用户的邮箱
		email = dataMap.get("email").toString();
		// TODO 动态传入参数
		StringBuilder sb = new StringBuilder();
		sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
		sb.append("<ECSRoot>");
		sb.append("    <Header>");
		sb.append("        <PlatNo>" + platNo + "</PlatNo>");
		sb.append("        <TimeStamp>" + timeStamp + "</TimeStamp>");
		sb.append("    </Header>");
		sb.append("    <Body>");
		sb.append("        <PID>" + pid + "</PID>");
		sb.append("        <CityNo>xxx</CityNo>");
		sb.append("        <IPAddr>" + ip + "</IPAddr>");
		sb.append("        <UName>" + disPhone + "</UName>");
		sb.append("        <UPWD>" + pwd + "</UPWD>");
		sb.append("        <UType>xxx</UType>");
		sb.append("        <UStatus>xxx</UStatus>");
		sb.append("        <Email>" + email + "</Email>");
		sb.append("    </Body>");
		sb.append("</ECSRoot>");
		return sb.toString();
	}	
}

以上就是使用HTTP方式post请求携带xml文本进行远端接口的调用,其他请求报文的格式可以类比.
OVER!

  • 5
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Java中发送HTTP POST请求并设置报文头的expect参数,并且请求体的格式XML,可以使用Java内置的HttpURLConnection类。以下是一个示例代码: ```java import java.net.HttpURLConnection; import java.net.URL; import java.io.OutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; public class HttpPostWithXmlAndExpectHeader { public static void main(String[] args) throws Exception { String url = "http://example.com/api"; String xmlBody = "<user><name>John</name><age>30</age></user>"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置HTTP请求方法为POST con.setRequestMethod("POST"); // 设置报文头的expect参数 con.setRequestProperty("Expect", "100-continue"); // 设置请求格式XML con.setRequestProperty("Content-Type", "application/xml"); // 设置请求体 con.setDoOutput(true); OutputStream os = con.getOutputStream(); os.write(xmlBody.getBytes()); os.flush(); os.close(); // 获取响应 int responseCode = con.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 输出响应 System.out.println("Response Code : " + responseCode); System.out.println("Response Body : " + response.toString()); } } ``` 在代码中,我们首先建立一个URL对象,然后使用HttpURLConnection打开连接。我们设置HTTP请求方法为POST,并设置报文头的expect参数为"100-continue"。接下来,我们设置请求格式XML,并设置请求体并发送请求。最后,我们获取响应并输出响应码和响应体。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值