json文本协议
json:对象-字符串-byte[] -传输-byte[]-字符串-对象
pb:对象-byte[]-传输byte[]-对象
另一个例子在:pb协议 jdk序列化协议,考虑到文章太长,放于此instead of the bottom
client:
String wholeUrl = String.format("%s?sdkappid=%d&random=%d", URL, SDKAPPID, rnd); java.net.URL object = new URL(wholeUrl); HttpURLConnection con = (HttpURLConnection) object.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setRequestProperty("Content-Type", "application/json"); con.setRequestProperty("Accept", "application/json"); con.setRequestMethod("POST"); JSONObject data = new JSONObject(); JSONObject tel = new JSONObject(); tel.put("nationcode", nationCode); String phone = phoneNumber; tel.put("phone", phone); data.put("type", "0"); data.put("msg", content); String sig = stringMD5(APPKEY.concat(phone)); data.put("sig", sig); data.put("tel", tel); OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "utf-8"); wr.write(data.toString()); wr.flush(); // 显示 POST 请求返回的内容 StringBuilder sb = new StringBuilder(); int HttpResult = con.getResponseCode(); if (HttpResult == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8")); String line; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); JSONObject reObj = new JSONObject(sb.toString()); String res = (String)reObj.get("result"); if(!"0".equals(res)) { System.out.println("" + sb.toString()); LOGGER.error("SmsSender::sendMsg" + "-" + phoneNumber + ","+(String)reObj.get("errmsg")); } else { } } else { LOGGER.error("send failed and rps is: " + con.getResponseMessage()); throw new SmsException("send failed and rps is: " + con.getResponseMessage()); }
请求:
JSONObject data = new JSONObject();
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "utf-8");
wr.write(data.toString());
应答:
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
String line;
while ((line = br.readLine()) != null)
{
sb.append(line + "\n");
}
br.close();
JSONObject reObj = new JSONObject(sb.toString());
String res = (String)reObj.get("result");
server:
基于netty的http server
响应请求,读取参数:
HttpServerHandler
@Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { // 获取channel中的URI Attribute<String> attr = ctx.channel().attr(AttributeMapConstant.NETTY_CHANNEL_KEY_HTTP_REQ_URI); String uri = attr.get(); byte[] bs = new byte[msg.readableBytes()]; msg.readBytes(bs); String json = new String(bs);
BaseReq baseReq = JSON.parseObject(json, BaseReq.class);
返回应答:
tws:
HttpServerHandler
public static void rspTws(RequestIdentity ri, BaseDto dto) { String json = JSON.toJSONString(dto); Channel channel = ri.getClientChannel(); if (channel != null && channel.isActive()) { logger.info("3.返回http客户端:{},流水号:{}", json, ri.getReqId()); channel.writeAndFlush(getJsonBuffer(json))
String json = JSON.toJSONString(dto);
/** * JSON转ByteBuf * * @param json * @return */ private static ByteBuf getJsonBuffer(String json) { ByteBuf buffer = Unpooled.buffer(); buffer.writeBytes(json.getBytes()); return buffer; }
json.getBytes()
/** * HTTP消息体编码器 * @author shane * */ public class HttpBodyEncoder extends MessageToMessageEncoder<ByteBuf> { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { out.add(HttpCreateor.buildFullHttpResponse(msg).retain()); } }
public static FullHttpResponse buildFullHttpResponse(ByteBuf msg) { // 返回信息 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, msg); response.headers().set(HttpHeaderNames.CONTENT_TYPE, String.format("%s;charset=UTF-8", HttpHeaderValues.TEXT_PLAIN)); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()); // 返回 return response; }
action:
public class BodyToResponseEncoder extends MessageToMessageEncoder<ResponseMessage> { @Override protected void encode(ChannelHandlerContext channelHandlerContext, ResponseMessage responseMessage, List<Object> list) throws Exception { String json = JSON.toJSONString(responseMessage); FullHttpResponse response = new DefaultFullHttpResponse( HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(json.getBytes("utf-8"))); response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "application/json;charset=UTF-8"); response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes()); response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); // 下面2个支持跨域 response.headers().set(HttpHeaders.Names.ACCESS_CONTROL_ALLOW_ORIGIN, "*"); response.headers().set(HttpHeaders.Names.ACCESS_CONTROL_ALLOW_HEADERS, HttpHeaders.Names.CONTENT_TYPE); list.add(response); } }
String json = JSON.toJSONString(responseMessage);
json.getBytes("utf-8")