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. 【sparkSQL】创建DataFrame及保存

    首先我们要创建SparkSession val spark = SparkSession.builder() .appName("test") .master("loca ...

  2. MySQL Multi-Range Read

    MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO ...

  3. windows server 2016 docker 之创建使用虚拟交换机

    windows server 2016 Create a virtual switch for Hyper-V virtual machines 操作步骤: 服务器只有一块网卡连接了网络 尝试1: h ...

  4. 2017.11.10 MPLAB IPE + ICD-3+ PIC32MM

    A trouble with ICD-3  programmer. MCU:  PIC32MM sw:  MPLAB IPE tool:  ICD-3 1 product introduction a ...

  5. Some Interview Questions About Python

    一大波超链接即将袭来 Django认证流程 Python实现阶乘 Python文件处理 Python统计日志文件IP出现次数 JSON数据解析 JSON数据解析2 买卖股票的最佳时期 读取一个大文件比 ...

  6. Delphi Xe4 游戏开发的技术选型.

    asphyre 是支持 FireMonkey的. 利用Firemonkey的跨平台接口.实现 win,mac,ios. 其它方案估计就得靠 FPC 了. 好处是多了输出Andriod的可能. zeng ...

  7. 第二章 Linux目录介绍

    一级目录 /bin (普通用户)二进制命令所在目录 备注 /boot LINUX内核及系统引导程序所需的文件目录 常见分区:128M swap内存的1.5倍 /dev 设备文件的目录 比如声卡.磁盘. ...

  8. 使用macbook破解WPA/WPA2 wifi密码

    文本仅供学习交流. 我使用的系统是macbook pro 15: 安装aircrack-ng 使用homebrew安装,命令: brew install aircrack-ng 抓包-抓取带密码的握手 ...

  9. (六)java数据类型

      数据类型:决定了变量占据多大的空间,决定了变量存储什么类型的数据 整形: byte     1个字节 short    2个字节 int        4个字节 long     8个字节 浮点型 ...

  10. Windows下安装pillow、opencv库问题,亲测可行

    安装pillow 库 python -m pip install pillow 出自:http://blog.csdn.net/Riverhope/article/details/78766969 安 ...