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接口实战)的更多相关文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  2. 性能测试专题:Locust工具实战之“蝗虫”降世

    阅读全文需5分钟. 1. 前言 在上一篇文章中,我们已经为大家介绍了什么是Locust,具体可参照:性能专题:Locust工具实战之开篇哲学三问,简单来说,Locust 是基于 Python 语言下的 ...

  3. Postman系列三:Postman中post接口实战(上传文件、json请求)

    一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是:1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据:2.Get安全性比Post低 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  8. 「kuangbin带你飞」专题二十 斜率DP

    layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...

  9. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

随机推荐

  1. 【河南第十届省赛-D】年终奖金

    题目描述 ***公司承接了N个项目需要年底完成,每个项目有一定的难度系数.由于项目太多了,需要招聘大量的技术人员.要求每个技术人员至少完成K个项目. 考虑到有些项目之间相似性以及项目的难易程度,为了避 ...

  2. boost库做什么用呢?

    1.C++标准库不是已经很全面了吗?Boost又不是界面库,它主要解决些什么问题呢?哪类问题?2.Boost的开发人员都是C++标准委员会的吧,为什么没把它列做标准库,有什么不完善的问题吗? 3.Bo ...

  3. [QT][问题]关于QT语言家使用失败的原因之一

    按照标准的qt使用教程 ( http://www.qter.org/forum.php?mod=viewthread&tid=781 ) 实践了下,发现除去主界面外,点开的窗口多语言没有问题. ...

  4. linux之管道

    1. 进程间通信概述 进程是一个独立的资源分配单元,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源.进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要 ...

  5. 【sqlite】基础知识

    最近做一个数控系统的项目,winCE嵌入式操作系统+.Net Compact Framework环境+VS2008开发平台,开发的设备程序部署到winCE系统下的设备中运行.. 个年头,SQLite也 ...

  6. UVA11796 Dog Distance

    题意 PDF 分析 问题可以转化为小问题,即两条狗分别在线段上运动. 然后用相对运动知识可以认为甲不动,乙在线段上运动. 小问题就转化为点到线段的最小或最大距离. 时间复杂度\(O(I \times ...

  7. fn project 试用之后的几个问题

    今天试用fnproject  之后自己有些思考,后面继续解决   1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm  集成 ...

  8. Linux环境下安装jenkins

    废话不多说,直接开始 1.从官网下载Jenkins的war包 2.下载好的War放到Tomcat的网站根目录webapps下,然后启动Tomcat. 3.打开浏览器,输入http://IP:8080/ ...

  9. Maven项目合并

    当多个项目之间有关联.依赖jar包有重复时,可以考虑进行合并.举例,我一开始有一个test-pilling项目,pom文件如下: <project xmlns="http://mave ...

  10. Terracotta设计原理分析--(部分内容来自官方描述)

    因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...