java 后台模拟post表单请求发送key-value数据乱码

时间:2024-05-19 13:44:17

首先是key-value的模型:

public class PostValue {
  
    private String key;  
   
  
    private String value;  
  
    public PostValue(String key, String value)  
  
    {  
  
        this.key = key;  
  
        this.value = value;  
  
    }  
  
    public String getKey()  
  
    {  
  
        return key;  
  
    }  
  
    public void setKey(String key) {  
  
        this.key = key;  
  
    }  
  
    public String getValue()  
  
    {  
  
        return value;  
  
    }  
  
    public void setValue(String value)  
  
    {  
  
        this.value = value;  
  
    }  


}

然后是postutils :

public class PostUtils {


public static String sendPost(String url,List<PostValue> parameters ) {   
        String result = "";// 返回的结果   
        BufferedReader in = null;// 读取响应输入流   
        PrintWriter out = null;  //输出流 
        String params = "";// 编码之后的参数   
        try {   
            // 编码请求参数   
            if(parameters.size() == 1){//請求只有一个  
                for(PostValue p:parameters){ 
                String s=p.getKey()+"="+p.getValue();
                    System.out.println(1);
                    params=s;
                }  
            }else{  
            String x=null;
                for(PostValue p:parameters){  
                x+=p.getKey()+"="+p.getValue()+"&";
                }  
                params =x;
                System.out.println(2);
            }  
            // 创建URL对象   
            java.net.URL connURL = new java.net.URL(url);   
            // 打开URL连接   
            java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL.openConnection();   
            // 设置通用属性   
            httpConn.setRequestProperty("Accept", "*/*");   
            httpConn.setRequestProperty("Connection", "Keep-Alive");   
            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");   
            httpConn.setRequestProperty("Accept-Charset", "UTF-8");  
            httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");  
            // 设置POST方式   
            httpConn.setDoInput(true);   
            httpConn.setDoOutput(true);   
            // 获取HttpURLConnection对象对应的输出流   
            out = new PrintWriter(httpConn.getOutputStream());   
            // 发送请求参数 
            System.out.println("requers parms::"+params);
            out.write(params);   
            // flush输出流的缓冲   
            out.flush();   
            // 定义BufferedReader输入流来读取URL的响应,设置编码方式   
            in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(),"UTF-8"));   
            String line;   
            // 读取返回的内容   
            while ((line = in.readLine()) != null) {   
                result += line+"\r\n";   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        } finally {   
            try {   
                if (out != null) {   
                    out.close();   
                }   
                if (in != null) {   
                    in.close();   
                }   
            } catch (Exception ex) {   
                ex.printStackTrace();   
            }   
        }   
        return result;   
    }

public static void main(String[] args) {
List<PostValue> p=new ArrayList<PostValue>();
PostValue p1=new PostValue("q_source", "IxhuBltZIjCKM");
p.add(p1);
String sendPost = PostUtils.sendPost("https://dev-openapi.dmhmusic.com/OPENAPI/openApiLogin.json", p);
System.out.println("response result:"+sendPost);
}


}

发现在server端响应的是java 后台模拟post表单请求发送key-value数据乱码

通过postMan直接请求发现:

java 后台模拟post表单请求发送key-value数据乱码

这是一种数据压缩格式,详情见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding

然后将:

 in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(),"UTF-8"));   

修改成:

 GZIPInputStream gzipInputStream = new GZIPInputStream(httpConn.getInputStream());  
           in = new BufferedReader(new InputStreamReader(gzipInputStream));  

最终:

java 后台模拟post表单请求发送key-value数据乱码

当然也可以使用第三方jar包,比如okHttp.