package com.meidusa.amoeba.gateway.packet; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; /** * * @author Struct * */ public class GatewayRequestPacket extends AbstractGatewayPacket { private static final long serialVersionUID = 1L; public String apiName; public Map<String,String> parameterMap; public String authorizationString; public GatewayRequestPacket(){ type = PACKET_TYPE_SERVICE_REQUEST; } protected void writeBody(GatewayPacketBuffer buffer) throws UnsupportedEncodingException { buffer.writeLengthCodedString(apiName, GatewayPacketConstant.PACKET_CHARSET); if(parameterMap != null){ StringBuffer sb = new StringBuffer(); for(Map.Entry<String, String> entry : parameterMap.entrySet()){ sb.append(entry.getKey()).append("="); if(entry.getValue() != null){ sb.append(URLEncoder.encode(entry.getValue(), GatewayPacketConstant.PACKET_CHARSET)); } sb.append(GatewayPacketConstant.PACKET_CONTENT_SPLITER); } buffer.writeLengthCodedString(sb.toString(), GatewayPacketConstant.PACKET_CHARSET); }else{ buffer.writeLengthCodedString(null, GatewayPacketConstant.PACKET_CHARSET); } // write authorization charset if(this.version == VERSION_2){ if(authorizationString != null){ buffer.writeLengthCodedString(authorizationString, PACKET_CHARSET); } } } @Override protected void readBody(GatewayPacketBuffer buffer) { apiName = buffer.readLengthCodedString(GatewayPacketConstant.PACKET_CHARSET); String parameters = buffer.readLengthCodedString(GatewayPacketConstant.PACKET_CHARSET); parameterMap = new HashMap<String,String>(); if(parameters != null){ String[] args = parameters.split(GatewayPacketConstant.PACKET_CONTENT_SPLITER); if(args != null && args.length>0){ for(String arg : args){ String[] argTuple = arg.split("="); String value = argTuple.length>1? argTuple[1]: ""; try { parameterMap.put(argTuple[0], URLDecoder.decode(value, GatewayPacketConstant.PACKET_CHARSET) ); } catch (UnsupportedEncodingException e) { parameterMap.put(argTuple[0],value); } } } } // add by Sun Ning/2010-04-20 if(this.version == VERSION_2 && buffer.hasRemaining()){ authorizationString = buffer.readLengthCodedString(PACKET_CHARSET); } } // public static void main(String[] args){ // try { // // "=%E5%A4%A9%E5%93%AA%E6%88%91%E6%B2%A1%E4%BA%8B%E5%B9%B2".getBytes("GBK"); // "=%E5%A4%A9%E5%93%AA%E6%88%91%E6%B2%A1%E4%BA%8B%E5%B9%B2".getBytes("utf-8"); // System.out.println(URLDecoder.decode("=%E5%A4%A9%E5%93%AA%E6%88%91%E6%B2%A1%E4%BA%8B%E5%B9%B2", PacketConstant.PACKET_CHARSET)); // } catch (UnsupportedEncodingException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // ServiceRequestPacket packet = new ServiceRequestPacket(); // packet.apiName = "aaaa"; // packet.parameterMap = new HashMap<String,String>(); // packet.parameterMap.put("appid", 1234+""); // packet.parameterMap.put("appName", "������û�¸�"); // byte[] bytes = packet.toByteBuffer().array(); // packet.init(bytes); // System.out.println(packet); // // } }