JAXB 专题二(BSP接口实战)
BSP下单接口
1、xml格式如下
<?xml version="1.0" encoding="utf-8"?> <Request service="OrderService" lang="zh-CN">
<Head>BSPdevelop</Head>
<Body>
<Order j_tel="联系电话" j_province="重庆" j_county="渝中区" j_contact="贺雄云" j_company="company1" j_city="重庆市" j_address="重庆重庆市渝中区测试一下" d_tel="电话" d_province="广东省"
d_county="南山区" d_contact="联系人" d_company="company1" d_city="深圳市" d_address="广东深圳宝安布心一村" pay_method="2" orderid="123456789"
is_gen_bill_no="1" is_docall="1" express_type="2">
<Cargo name="旧手机"/>
</Order>
</Body>
</Request>
2、构造的xml实体类如下
import java.util.List; import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType; /**
* @ClassName BSPRequest
* @Description bsp接口请求元素
* @author
* @Date 2018年4月20日 下午4:46:04
* @version 1.0.0
* @param <T>
*/
@XmlRootElement(name="Request")
//@XmlSeeAlso({OrderServiceBody.class}) //工具类中实例化时如果没有加入泛型对象,也可以在这里利用此注解加入可能用到的所有泛型对象
@XmlType(propOrder = { "head", "body"}) //指明生成xml的标签顺序,写属性名
public class BSPRequest<T> { private String service; //请求接口服务名
private String lang; //响应报文语言,中文简体:zh-CN
private String head; //接入编码:BSPdevelop
private T body; //body:请求数据XML @XmlAttribute(name="service")
public String getService() {
return service;
} public void setService(String service) {
this.service = service;
} @XmlAttribute(name="lang")
public String getLang() {
return lang;
} public void setLang(String lang) {
this.lang = lang;
} @XmlElement(name="Head")
public String getHead() {
return head;
} public void setHead(String head) {
this.head = head;
} @XmlElement(name="Body")
public T getBody() {
return body;
} public void setBody(T body) {
this.body = body;
} }
import javax.xml.bind.annotation.XmlElement; /**
* @ClassName OrderServiceBody
* @Description BSP下单接口请求体
* @author
* @Date 2018年4月20日 下午5:18:28
* @version 1.0.0
*/
public class OrderServiceRequestBody {
private BSPOrder order;//order:下单接口请求数据 @XmlElement(name="Order")
public BSPOrder getOrder() {
return order;
} public void setOrder(BSPOrder order) {
this.order = order;
} }
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement; /**
* @ClassName BSPOrder
* @Description 下单(含筛选)接口 Order元素
* @author
* @Date 2018年4月20日 下午4:45:56
* @version 1.0.0
*/
public class BSPOrder {
private String orderId; //客户订单号
private int isGenBillNo; //1:要求接口返回顺丰运单号
private String jCompany; //寄件方公司名称
private String jContact; //寄件方联系人
private String jTel; //寄件方联系电话
private String jProvince; //寄件方省
private String jCity; //寄件方城市
private String jCounty; //寄件方区/县
private String jAddress; //寄件方详细地址
private String dCompany; //到件方公司名称
private String dContact; //到件方联系人
private String dTel; //到件方联系电话
private String dProvince; //到件方所在省份
private String dCity; //到件方所在城市
private String dCounty; //到件方所在县/区
private String dAddress; //到件方详细地址
private String custid; //顺丰月结卡号
private int payMethod; //付款方式;1:寄方付 2:收方付 3:第三方付
private String remark; //备注
// private int isGenEletricPic; //是否生成电子运单图片,1为是
private OrderCargo cargo; //order下的cargo元素
private int isDocall; //是否要求通过是否手持终端;通知顺丰收派员收件;1:要求 ;其它为不要求
private int expressType; //顺丰默认是1:顺丰特快,2:顺丰特惠; @XmlAttribute(name="orderid")
public String getOrderId() {
return orderId;
} public void setOrderId(String orderId) {
this.orderId = orderId;
} @XmlAttribute(name="is_gen_bill_no")
public int getIsGenBillNo() {
return isGenBillNo;
} public void setIsGenBillNo(int isGenBillNo) {
this.isGenBillNo = isGenBillNo;
} @XmlAttribute(name="j_company")
public String getjCompany() {
return jCompany;
} public void setjCompany(String jCompany) {
this.jCompany = jCompany;
} @XmlAttribute(name="j_contact")
public String getjContact() {
return jContact;
} public void setjContact(String jContact) {
this.jContact = jContact;
} @XmlAttribute(name="j_tel")
public String getjTel() {
return jTel;
} public void setjTel(String jTel) {
this.jTel = jTel;
} @XmlAttribute(name="j_address")
public String getjAddress() {
return jAddress;
} public void setjAddress(String jAddress) {
this.jAddress = jAddress;
} @XmlAttribute(name="d_company")
public String getdCompany() {
return dCompany;
} public void setdCompany(String dCompany) {
this.dCompany = dCompany;
} @XmlAttribute(name="d_contact")
public String getdContact() {
return dContact;
} public void setdContact(String dContact) {
this.dContact = dContact;
} @XmlAttribute(name="d_tel")
public String getdTel() {
return dTel;
} public void setdTel(String dTel) {
this.dTel = dTel;
} @XmlAttribute(name="d_province")
public String getdProvince() {
return dProvince;
} public void setdProvince(String dProvince) {
this.dProvince = dProvince;
} @XmlAttribute(name="d_city")
public String getdCity() {
return dCity;
} public void setdCity(String dCity) {
this.dCity = dCity;
} @XmlAttribute(name="d_county")
public String getdCounty() {
return dCounty;
} public void setdCounty(String dCounty) {
this.dCounty = dCounty;
} @XmlAttribute(name="d_address")
public String getdAddress() {
return dAddress;
} public void setdAddress(String dAddress) {
this.dAddress = dAddress;
} @XmlAttribute(name="custid")
public String getCustid() {
return custid;
} public void setCustid(String custid) {
this.custid = custid;
} @XmlAttribute(name="pay_method")
public int getPayMethod() {
return payMethod;
} public void setPayMethod(int payMethod) {
this.payMethod = payMethod;
} @XmlAttribute(name="remark")
public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
} @XmlElement(name="Cargo",required = true)
public OrderCargo getCargo() {
return cargo;
} public void setCargo(OrderCargo cargo) {
this.cargo = cargo;
} @XmlAttribute(name="j_province")
public String getjProvince() {
return jProvince;
} public void setjProvince(String jProvince) {
this.jProvince = jProvince;
} @XmlAttribute(name="j_city")
public String getjCity() {
return jCity;
} public void setjCity(String jCity) {
this.jCity = jCity;
} @XmlAttribute(name="j_county")
public String getjCounty() {
return jCounty;
} public void setjCounty(String jCounty) {
this.jCounty = jCounty;
} @XmlAttribute(name="is_docall")
public int getIsDocall() {
return isDocall;
} public void setIsDocall(int isDocall) {
this.isDocall = isDocall;
} @XmlAttribute(name="express_type")
public int getExpressType() {
return expressType;
} public void setExpressType(int expressType) {
this.expressType = expressType;
} }
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement; /**
* @ClassName OrderCargo
* @Description 元素<请求>Order/Cargo
* @author
* @Date 2018年4月20日 下午4:46:45
* @version 1.0.0
*/
public class OrderCargo {
private String name; //货物名称:旧手机 @XmlAttribute(name="name")
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
3、jaxb的工具类
import java.io.StringReader;
import java.io.StringWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* @ClassName JaxbXmlUtil
* @Description Jaxb工具类 xml和java类相互转换
* @author
* @Date 2018年4月20日 下午4:45:34
* @version 1.0.0
*/
public class JaxbXmlUtil { public static final String DEFAULT_ENCODING = "UTF-8"; /**
* pojo转换成xml 默认编码UTF-8
*
* @param obj 待转化的对象
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj) throws Exception {
return convertToXml(obj, DEFAULT_ENCODING);
} /**
* pojo转换成xml
*
* @param obj 待转化的对象
* @param encoding 编码
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj, String encoding) throws Exception {
String result = null;
JAXBContext context = JAXBContext.newInstance(obj.getClass(), OrderServiceRequestBody.class, RouteServiceRequestBody.class);//指定obj中可以传入的泛型对象,这里BSPRequest<T>使用了泛型,所以必须加入具体可能用到的泛型对象
// JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString(); return result;
} /**
* xml转换成JavaBean
*
* @param xml xml格式字符串
* @param t 待转化的对象
* @return 转化后的对象
* @throws Exception JAXBException
*/
@SuppressWarnings("unchecked")
public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
T obj = null;
JAXBContext context = JAXBContext.newInstance(t);
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = (T) unmarshaller.unmarshal(new StringReader(xml));
return obj;
} /**
* @Description <body> 标签中其余字符去掉 (TODO这里用一句话描述这个方法的作用)
* @param str
* @return
* @throws Exception
*/
public static String StringFilter(String str)throws Exception {
//将<Body xsi:type="orderServiceBody" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">替换为<Body>
String regEx = "<Body(.|\\s)*?>";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
return matcher.replaceAll("<Body>").trim();
}
}
测试下单接口如下
public class XMLTest {
public static void main(String[] args) {
try {
BSPRequest<OrderServiceRequestBody> orderService = new BSPRequest<OrderServiceRequestBody>();
orderService.setHead("BSPdevelop");
orderService.setLang("zh-CN");
orderService.setService("OrderService"); BSPOrder order = new BSPOrder();
order.setOrderId("15648154");
order.setIsGenBillNo(1);
order.setjProvince("重庆");
order.setjCity("重庆");
order.setjCounty("璧山区");
order.setjAddress("广东省深圳市宝安区布心一村");
order.setdCompany("公司1");
order.setdContact("联系人");
order.setdTel("电话");
order.setdAddress("地址");
order.setPayMethod(2); order.setjTel("电话"); OrderCargo cargo = new OrderCargo();
cargo.setName("旧手机");
order.setCargo(cargo); OrderServiceRequestBody body = new OrderServiceRequestBody();
body.setOrder(order);
orderService.setBody(body); String xml = JaxbXmlUtil.convertToXml(orderService);
System.out.println(xml);
String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone=\"yes\"", ""); //jaxb默认会生成standalone字符串,如果不想要可以这样替换为空串
System.out.println(xmlRequest); } catch (Exception e) {
e.printStackTrace();
} }
}
BSP路由查询接口
1、xml格式如下
<Request service='RouteService' lang='zh-CN'>
<Head>BSPdevelop</Head>
<Body>
<RouteRequest
tracking_type='1'
method_type='1'
tracking_number='444003077898'/>
</Body>
</Request>
2、构造的xml实体类如下(请求类和下单一样,只不过具体的请求体不一样)
import javax.xml.bind.annotation.XmlElement;
/**
* @ClassName RouteServiceBody
* @Description 路由查询接口请求体
* @author
* @Date 2018年4月24日 上午10:46:32
* @version 1.0.0
*/
public class RouteServiceRequestBody {
private BSPRouteRequest routeRequest; //RouteRequest元素 @XmlElement(name="RouteRequest")
public BSPRouteRequest getRouteRequest() {
return routeRequest;
} public void setRouteRequest(BSPRouteRequest routeRequest) {
this.routeRequest = routeRequest;
} }
import javax.xml.bind.annotation.XmlAttribute; /**
* @ClassName BSPRouteRequest
* @Description 路由查询接口RouteRequest元素
* @author
* @Date 2018年4月24日 上午10:48:57
* @version 1.0.0
*/
public class BSPRouteRequest {
private int trackingType; //查询号类别,1:顺丰运单号查询;2:客户订单号查询
private String trackingNumber; //查询号 @XmlAttribute(name="tracking_type")
public int getTrackingType() {
return trackingType;
} public void setTrackingType(int trackingType) {
this.trackingType = trackingType;
} @XmlAttribute(name="tracking_number")
public String getTrackingNumber() {
return trackingNumber;
} public void setTrackingNumber(String trackingNumber) {
this.trackingNumber = trackingNumber;
} }
3、测试路由查询接口(jaxb工具类和前面一样)
public class XMLTest {
public static void main(String[] args) {
try {
BSPRequest<RouteServiceRequestBody> routeService = new BSPRequest<RouteServiceRequestBody>();
routeService.setHead("BSPdevelop");
routeService.setLang("zh-CN");
routeService.setService("RouteService");
RouteServiceRequestBody body = new RouteServiceRequestBody();
BSPRouteRequest routeRequest = new BSPRouteRequest();
routeRequest.setTrackingType(2);
routeRequest.setTrackingNumber("哈哈");
body.setRouteRequest(routeRequest);
routeService.setBody(body); String xml = JaxbXmlUtil.convertToXml(routeService);
System.out.println(xml);
String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone=\"yes\"", "");
System.out.println(xmlRequest); } catch (Exception e) {
e.printStackTrace();
} }
}
这两个都是jaxb将java对象转换为xml的例子,下面讲一个xml转换为java对象的例子。
BSP路由查询接口的响应体XML转换为java对象
1、xml格式如下
<?xml version="1.0" encoding="utf-8"?> <Response service="RouteService">
<Head>OK</Head>
<Body>
<RouteResponse mailno="444003077899">
<Route accept_time="2015-01-04 10:11:26" accept_address="深圳" remark="已收件" opcode="50"/>
<Route accept_time="2015-01-05 17:41:50" remark="此件签单返还的单号为 123638813181" opcode="922"/>
</RouteResponse>
</Body>
</Response>
2、构造的xml实体类如下
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType; /**
* @ClassName BSPResponse
* @Description bsp响应接口
* @author
* @Date 2018年4月24日 上午11:19:14
* @version 1.0.0
*/
@XmlRootElement(name="Response")
public class BSPResponse {
private String service; //响应接口服务名
private String head; //OK:交易成功,只返回Body元素;ERR:交易失败,只返回Error元素; Body元素和Error元素不能同时存在
private BSPError error; //失败时的error元素
private BSPResponseBody body; //响应体 @XmlAttribute(name="service")
public String getService() {
return service;
} public void setService(String service) {
this.service = service;
} @XmlElement(name="Head") //例如<Head>OK</Head>这样的用XmlElement注释,所以此注释是填充标签之间的内容;而XmlAttribute是填充开始标签中的属性值
public String getHead() {
return head;
} public void setHead(String head) {
this.head = head;
} @XmlElement(name="ERROR")
public BSPError getError() {
return error;
} public void setError(BSPError error) {
this.error = error;
} @XmlElement(name="Body")
public BSPResponseBody getBody() {
return body;
} public void setBody(BSPResponseBody body) {
this.body = body;
} @Override
public String toString() {
return "BSPResponse [service=" + service + ", head=" + head + ", error=" + error + ", body=" + body + "]";
} }
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue; /**
* @ClassName BSPError
* @Description 响应Error元素
* @author
* @Date 2018年4月24日 上午11:43:46
* @version 1.0.0
*/
public class BSPError {
private int code; //错误代码
private String message; //错误详细信息 @XmlAttribute(name="code")
public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} @XmlValue //<ERROR code="4001">系统发生数据错误或运行时异常</ERROR>像这样,既有属性值,又有标签内容怎么办呢?就用到XmlValue注释,此注释就是添加内容,不会增加子标签;
public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} @Override
public String toString() {
return "BSPError [code=" + code + ", message=" + message + "]";
} }
import javax.xml.bind.annotation.XmlElement; /**
* @ClassName BSPResponseBody
* @Description BSP响应体(这里用一句话描述这个类的作用)
* @author 贺雄云
* @Date 2018年4月25日 上午11:41:04
* @version 1.0.0
*/
public class BSPResponseBody {
private BSPOrderResponse orderResponse; //下单接口响应体
private BSPRouteResponse routeResponse; //路由查询接口响应体内容 @XmlElement(name="OrderResponse")
public BSPOrderResponse getOrderResponse() {
return orderResponse;
} public void setOrderResponse(BSPOrderResponse orderResponse) {
this.orderResponse = orderResponse;
} @XmlElement(name="RouteResponse")
public BSPRouteResponse getRouteResponse() {
return routeResponse;
} public void setRouteResponse(BSPRouteResponse routeResponse) {
this.routeResponse = routeResponse;
}
}
注意:我们前面请求接口例子中,请求接口对象是可以用泛型的,可是我网上找了发现xml转换为javabean时用不了泛型,所以我就在响应体BSPResponseBody中写了多个响应体对象,这里有下单和路由查询两个响应体对象,这样我也不用重复写多个响应接口BSPResponse ,一个响应接口对象中有一个BSPResponseBody响应体对象,响应体对象中有多个不同的响应对象,即使要转换的xml中没有此对象也没关系,不过是转换后的java对象中对应的该对象为空而已,不会影响业务代码。
import java.util.List; import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement; /**
* @ClassName BSPRouteResponse
* @Description 路由查询接口响应元素RouteResponse
* @author
* @Date 2018年4月25日 上午10:37:46
* @version 1.0.0
*/
public class BSPRouteResponse {
private String mailNo; //顺丰运单号
private String orderId; //客户订单号,按客户订单号查询时为必填。按顺丰运单号查询时为空。
private List<RouteResponseRoute> routeResponseRouteList; //子元素 RouteResponse/Route,多个 @XmlAttribute(name="mailno")
public String getMailNo() {
return mailNo;
} public void setMailNo(String mailNo) {
this.mailNo = mailNo;
} @XmlAttribute(name="orderid")
public String getOrderId() {
return orderId;
} public void setOrderId(String orderId) {
this.orderId = orderId;
} @XmlElement(name="Route")
public List<RouteResponseRoute> getRouteResponseRouteList() {
return routeResponseRouteList;
} public void setRouteResponseRouteList(List<RouteResponseRoute> routeResponseRouteList) {
this.routeResponseRouteList = routeResponseRouteList;
} @Override
public String toString() {
return "BSPRouteResponse [mailNo=" + mailNo + ", orderId=" + orderId + ", routeResponseRouteList="
+ routeResponseRouteList + "]";
} }
import java.util.Date; import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /**
* @ClassName RouteResponseRoute
* @Description 路由查询接口 响应元素 RouteResponse/Route
* @author
* @Date 2018年4月25日 上午10:50:27
* @version 1.0.0
*/
public class RouteResponseRoute implements Comparable<RouteResponseRoute> {
private Date acceptTime; //路由节点发生的时间,格式:YYYY-MM-DD HH24:MM:SS,示例:2012-7-30 09:30:00。
private String acceptAddress; //路由节点发生的地点
private String remark; //路由节点具体描述
private String opcode; //路由节点操作码 @XmlAttribute(name="accept_time")
@XmlJavaTypeAdapter(JaxbDateSerializer.class) //日期格式的转换,定义了一个JaxbDateSerializer转换类,使用此注解就可以了
public Date getAcceptTime() {
return acceptTime;
} public void setAcceptTime(Date acceptTime) {
this.acceptTime = acceptTime;
} @XmlAttribute(name="accept_address")
public String getAcceptAddress() {
return acceptAddress;
} public void setAcceptAddress(String acceptAddress) {
this.acceptAddress = acceptAddress;
} @XmlAttribute(name="remark")
public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
} @XmlAttribute(name="opcode")
public String getOpcode() {
return opcode;
} public void setOpcode(String opcode) {
this.opcode = opcode;
} @Override
public String toString() {
return "RouteResponseRoute [acceptTime=" + acceptTime + ", acceptAddress=" + acceptAddress + ", remark="
+ remark + ", opcode=" + opcode + "]";
} @Override
public int compareTo(RouteResponseRoute o) {
long l = this.getAcceptTime().getTime() - o.getAcceptTime().getTime();
if (l > 0) {
return -1;
}else if (l == 0) {
return 0;
}else {
return 1;
}
} }
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter; //日期转化的类
public class JaxbDateSerializer extends XmlAdapter<String, Date> { private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override
public Date unmarshal(String date) throws Exception {
return dateFormat.parse(date);
} @Override
public String marshal(Date date) throws Exception {
return dateFormat.format(date);
} }
3、测试xml转换为java对象(jaxb工具类和前面一样)
public class XMLTest {
public static void main(String[] args) {
try {
BSPResponse response = JaxbXmlUtil.convertToJavaBean("<Response service='RouteService'><Head>OK</Head><Body><RouteResponse mailno='444003077899'><Route accept_time='2015-01-04 10:11:26' accept_address='深圳' remark='已收件' opcode='50'/><Route accept_time='2015-01-05 17:41:50' remark='此件签单返还的单号为 123638813181' opcode='922'/></RouteResponse></Body></Response>", BSPResponse.class);
System.out.println("head:" + response.getHead());
System.out.println("service:" + response.getService());
System.out.println("error:" + response.getError());
System.out.println("osrBody:" + response.getBody().getOrderResponse());
System.out.println("rsrBody:" + response.getBody().getRouteResponse());
System.out.println("RouteResponse/route:" + response.getBody().getRouteResponse().getRouteResponseRouteList());
Date d1 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(0).getAcceptTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str1 = sdf.format(d1);
System.out.println(str1);
Date d2 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(1).getAcceptTime();
String str2 = sdf.format(d2);
System.out.println(str2); } catch (Exception e) {
e.printStackTrace();
} }
}
后续用到更复杂jaxb操作的再来补上....
JAXB 专题二(BSP接口实战)的更多相关文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 性能测试专题:Locust工具实战之“蝗虫”降世
阅读全文需5分钟. 1. 前言 在上一篇文章中,我们已经为大家介绍了什么是Locust,具体可参照:性能专题:Locust工具实战之开篇哲学三问,简单来说,Locust 是基于 Python 语言下的 ...
- Postman系列三:Postman中post接口实战(上传文件、json请求)
一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是:1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据:2.Get安全性比Post低 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 「kuangbin带你飞」专题二十 斜率DP
layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...
- 「kuangbin带你飞」专题二十二 区间DP
layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...
随机推荐
- 【河南第十届省赛-D】年终奖金
题目描述 ***公司承接了N个项目需要年底完成,每个项目有一定的难度系数.由于项目太多了,需要招聘大量的技术人员.要求每个技术人员至少完成K个项目. 考虑到有些项目之间相似性以及项目的难易程度,为了避 ...
- boost库做什么用呢?
1.C++标准库不是已经很全面了吗?Boost又不是界面库,它主要解决些什么问题呢?哪类问题?2.Boost的开发人员都是C++标准委员会的吧,为什么没把它列做标准库,有什么不完善的问题吗? 3.Bo ...
- [QT][问题]关于QT语言家使用失败的原因之一
按照标准的qt使用教程 ( http://www.qter.org/forum.php?mod=viewthread&tid=781 ) 实践了下,发现除去主界面外,点开的窗口多语言没有问题. ...
- linux之管道
1. 进程间通信概述 进程是一个独立的资源分配单元,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源.进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要 ...
- 【sqlite】基础知识
最近做一个数控系统的项目,winCE嵌入式操作系统+.Net Compact Framework环境+VS2008开发平台,开发的设备程序部署到winCE系统下的设备中运行.. 个年头,SQLite也 ...
- UVA11796 Dog Distance
题意 PDF 分析 问题可以转化为小问题,即两条狗分别在线段上运动. 然后用相对运动知识可以认为甲不动,乙在线段上运动. 小问题就转化为点到线段的最小或最大距离. 时间复杂度\(O(I \times ...
- fn project 试用之后的几个问题
今天试用fnproject 之后自己有些思考,后面继续解决 1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm 集成 ...
- Linux环境下安装jenkins
废话不多说,直接开始 1.从官网下载Jenkins的war包 2.下载好的War放到Tomcat的网站根目录webapps下,然后启动Tomcat. 3.打开浏览器,输入http://IP:8080/ ...
- Maven项目合并
当多个项目之间有关联.依赖jar包有重复时,可以考虑进行合并.举例,我一开始有一个test-pilling项目,pom文件如下: <project xmlns="http://mave ...
- Terracotta设计原理分析--(部分内容来自官方描述)
因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...