转载

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;     }     } 
正文到此结束
Loading...