zoukankan      html  css  js  c++  java
  • HttpClient发送get post请求和数据解析

     

    最近在跟app对接的时候有个业务是微信登录,在这里记录的不是如何一步步操作第三方的,因为是跟app对接,所以一部分代码不是由我写,
    我只负责处理数据,但是整个微信第三方的流程大致都差不多,app端说要传给我access_token和openid,对用户的处理还是要我去请求微信.
    这里写一下发送请求以及解析数据的过程来获取用户资料,其他的微信业务再做深究

    复制代码
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
        @RequestMapping("getWeChatUserInfo")
        @ResponseBody
        public String getWeChatUserInfo(String token,String openid){
            String urlNameString = "https://api.weixin.qq.com/sns/userinfo?access_token=TOKEN&openid=OPENID";
            urlNameString=urlNameString.replace("TOKEN", token);
            urlNameString=urlNameString.replace("OPENID",openid);
            String result="";
              try {
                    // 根据地址获取请求
                    HttpGet request = new HttpGet(urlNameString);//这里发送get请求
                    // 获取当前客户端对象
                    HttpClient httpClient = new DefaultHttpClient();
                    // 通过请求对象获取响应对象
                    HttpResponse response = httpClient.execute(request);
                    
                    // 判断网络连接状态码是否正常(0--200都数正常)
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        result= EntityUtils.toString(response.getEntity(),"utf-8");
                    } 
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            return result;
            //....result是用户信息,站内业务以及具体的json转换这里也不写了...
        }
    复制代码

    其中result打印出来是:

    复制代码
    {
    openid: "oIy1SuJhhc6Fk6z*****ecjrzySY",
    nickname: "小丑",
    sex: 1,
    language: "zh_CN",
    city: "海淀",
    province: "北京",
    country: "中国",
    headimgurl: "http://wx.qlogo.cn/mmopen/WtXTficAHyjWBgHZX2Yf*****LK2CV9yLeiaHxKK8dhZshQgYeJEamaibT0UHQLicCfeBh698pJLc30Hrr6COHBqAKIj2rVQn3qKZ/0",
    privilege: [ ],
    unionid: "oK8SLt5GNKgJwPlL0JEST93***TQ"
    }
    复制代码

    -----------------------------------------------------------
    延伸:

    Apache也有一个发送post请求的方法:

    复制代码
    String url="http://XXX..";
    //POST的URL
    HttpPost httppost=new HttpPost(url);
    //建立HttpPost对象
    List<NameValuePair> params=new ArrayList<NameValuePair>();
    //建立一个NameValuePair数组,用于存储欲传送的参数
    params.add(new BasicNameValuePair("pwd","2544"));
    //添加参数
    httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
    //设置编码
    HttpResponse response=new DefaultHttpClient().execute(httppost);
    //发送Post,并返回一个HttpResponse对象
    if(response.getStatusLine().getStatusCode()==200){//如果状态码为200,就是正常返回
    String result=EntityUtils.toString(response.getEntity());
    复制代码

    以上的Apache Client的get post方法发送请求在java中其实已经有内置了,只不过代码稍复杂了一些

    比如发送get请求

    复制代码
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class HttpRequest {
        /**
         * 向指定URL发送GET方法的请求
         * 
         * @param url
         *            发送请求的URL
         * @param param
         *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
         * @return URL 所代表远程资源的响应结果
         */
        public static String sendGet(String url, String param) {
            String result = "";
            BufferedReader in = null;
            try {
                String urlNameString = url + "?" + param;
                URL realUrl = new URL(urlNameString);
                // 打开和URL之间的连接
                URLConnection connection = realUrl.openConnection();
                // 设置通用的请求属性
                connection.setRequestProperty("accept", "*/*");
                connection.setRequestProperty("connection", "Keep-Alive");
                connection.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 建立实际的连接
                connection.connect();
                // 获取所有响应头字段
                Map<String, List<String>> map = connection.getHeaderFields();
                // 遍历所有的响应头字段
                for (String key : map.keySet()) {
                    System.out.println(key + "--->" + map.get(key));
                }
                // 定义 BufferedReader输入流来读取URL的响应
                in = new BufferedReader(new InputStreamReader(
                        connection.getInputStream(),"utf-8"));//防止乱码
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送GET请求出现异常!" + e);
                e.printStackTrace();
            }
            // 使用finally块来关闭输入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            return result;
        }
    复制代码

    发送post请求

    复制代码
     /**
         * 向指定 URL 发送POST方法的请求
         * 
         * @param url
         *            发送请求的 URL
         * @param param
         *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
         * @return 所代表远程资源的响应结果
         */
        public static String sendPost(String url, String param) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(conn.getOutputStream());
                // 发送请求参数
                out.print(param);
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(),"utf-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送 POST 请求出现异常!"+e);
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result;
        }    
    }
    复制代码
  • 相关阅读:
    SQL Server中sys.syslogin中updatedate字段的浅析
    ORACLE 中NUMBER类型默认的精度和Scale问题
    SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因
    Percona XtraBackup 安装介绍篇
    ORACLE中死锁的知识点总结
    Linux如何查看YUM的安装目录
    find: missing argument to `-exec'
    Linux平台下RMAN异机恢复总结
    WARNING: Re-reading the partition table failed with error 22: Invalid argument
    Windows Server 2012更新补丁后导致Micosoft ODBC for Oracle出现问题
  • 原文地址:https://www.cnblogs.com/muyuchengguang/p/9857227.html
Copyright © 2011-2022 走看看