【原生态】Http请求数据 与 发送数据

 

今天项目组小弟居然问我怎么用java访问特定的地址获取数据和发送请求

 

Http请求都是通过输入输出流来进行操作的,首先要制定GET或者POST,默认是GET,在安全和数据量较大情况下请使用post

根据url建立链接,读取输入输出流,从中取得相应的返回数据,

 

http是无序的,在安全性极高的地方请使用https,但是https传输效率差不多只是http的1/10,所以除非特别必要,请谨慎选择

 

我将我以前写的微信开发代码贴一部分出来,这里就有根据地址获取请求数据和向某一个特定端口发送数据

package com.xiao.weixin.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.xiao.weixin.common.jdbc.DataSource;
import com.xiao.weixin.dao.WeixinApiMapper;
import com.xiao.weixin.entity.AccessToken;
import com.xiao.weixin.service.WeixinApiService;
import com.xiao.weixin.utils.ApiUrl;
import com.xiao.weixin.utils.CommonUtil;
import com.xiao.weixin.utils.DateUtil;

@Service(value = "weixinApiService")
public class WeixinApiServiceImpl implements WeixinApiService {

    private Logger log = LoggerFactory.getLogger(WeixinApiServiceImpl.class);

    @Value("${weixin.appID}")
    private String appID;

    @Value("${weixin.appsecret}")
    private String appsecret;

    @Value("${weixin.menu}")
    private String menuString;

    @Value("${weixin.token}")
    private String weixinToken;

    @Resource
    private WeixinApiMapper weixinApiMapper;

    @Override
    @DataSource
    public String getAccessToken() {
        String access_token = null;
        try {
            AccessToken token = weixinApiMapper.findToken();// 数据库查找没过期的token并返回
            if (token != null) {
                access_token = token.getAccessToken();
            }
        } catch (Exception e) {
            log.error("获取accessToken出错");
            e.printStackTrace();
        }
        log.debug("获取到的accessToken是:" + access_token);
        return access_token;
    }

    @Override
    public void refreshAccessToken() {
        log.debug("重新生成accessToken开始");
        try {
            String url = ApiUrl.GET_ACCESSTOKEN.replace("APPID", appID)
                    .replace("APPSECRET", appsecret);
            log.debug("重新获取token的请求地址为:" + url);
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet
                    .openConnection();

            http.setRequestMethod("GET");
            http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
            System.setProperty("sun.net.client.defaultReadTimeout", "30000");

            http.connect();

            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] jsonBytes = new byte[size];
            is.read(jsonBytes);
            String message = new String(jsonBytes, "UTF-8");
            System.out.println("message:" + message);
            JSONObject json = new JSONObject(message);
            String access_token = json.getString("access_token");
            Integer expiresIn = json.getInt("expires_in");
            log.debug("重新生成accessToken结束   成功");

            // 根据取得的accessToken 来获取jsapi_ticket
            String ticketUrl = ApiUrl.GET_JSAPITICKET.replace("ACCESSTOKEN",
                    access_token);
            log.debug("重新获取jsapi_ticket的请求地址为:" + ticketUrl);
            URL ticketUrlGet = new URL(ticketUrl);
            HttpURLConnection tickeHttp = (HttpURLConnection) ticketUrlGet
                    .openConnection();

            tickeHttp.setRequestMethod("GET");
            tickeHttp.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            tickeHttp.setDoOutput(true);
            tickeHttp.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
            System.setProperty("sun.net.client.defaultReadTimeout", "30000");

            tickeHttp.connect();

            InputStream tickeIs = tickeHttp.getInputStream();
            byte[] tickeJsonBytes = new byte[tickeIs.available()];
            tickeIs.read(tickeJsonBytes);
            String tickeMessage = new String(tickeJsonBytes, "UTF-8");
            System.out.println("message:" + message);
            JSONObject ticketJson = new JSONObject(tickeMessage);
            String ticket = ticketJson.getString("ticket");

            AccessToken accessToken = new AccessToken();
            accessToken.setAppId(appID);
            accessToken.setSecret(appsecret);
            accessToken.setAccessToken(access_token);
            accessToken.setJsApiTicket(ticket);
            accessToken.setExpireTime(DateUtil.getExpiresTime(expiresIn));
            accessToken.setCreateTime(new Date());
            weixinApiMapper.insertToken(accessToken);// 将新生成的token保存到数据库
        } catch (Exception e) {
            log.error("获取accessToken出错");
            e.printStackTrace();
        }
    }

    @Override
    public String createMenu() {
        String access_token = getAccessToken();
        String url = ApiUrl.CREATE_MENU.replace("ACCESSTOKEN", access_token);
        log.debug("创建菜单的请求地址为:" + url);
        try {
            log.debug("menuString:" + menuString);
            URL urlPost = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlPost
                    .openConnection();
            http.setRequestMethod("POST");
            http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
            System.setProperty("sun.net.client.defaultReadTimeout", "30000");

            http.connect();
            OutputStream os = http.getOutputStream();
            os.write(menuString.getBytes("UTF-8"));
            os.flush();
            os.close();

            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] jsonBytes = new byte[size];
            is.read(jsonBytes);
            String message = new String(jsonBytes, "UTF-8");
            return message;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return "-1";
        } catch (IOException e) {
            e.printStackTrace();
            return "-1";
        }
    }

    @Override
    public Map<String, String> getSignature(String url) {
        Map<String, String> map = new HashMap<String, String>();
        try {
            String jsapi_ticket = getJsApiTicket();
            String nonceStr = "Wm3WZYTPz0wzccnW";
            long timestamp = System.currentTimeMillis() / 1000;

            map.put("appId", appID);
            map.put("timestamp", timestamp + "");
            map.put("nonceStr", nonceStr);

            String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
                    "timestamp=" + timestamp, "noncestr=" + nonceStr,
                    "url=" + url };
            Arrays.sort(paramArr);
            String content = paramArr[0].concat("&" + paramArr[1])
                    .concat("&" + paramArr[2]).concat("&" + paramArr[3]);
            log.debug("拼接之后的content为:" + content);
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] digest = md.digest(content.toString().getBytes());
            String gensignature = CommonUtil.byteToStr(digest);
            map.put("signature", gensignature);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("获取JSAPI签名信息失败,错误信息:" + e);
            return null;
        }
    }

    @Override
    public String getJsApiTicket() {
        String jsApiTicket = null;
        try {
            AccessToken token = weixinApiMapper.findToken();// 数据库查找没过期的token并返回
            if (token != null) {
                jsApiTicket = token.getJsApiTicket();
            }
        } catch (Exception e) {
            log.error("获取jsApiTicket出错");
            e.printStackTrace();
        }
        log.debug("获取到的jsApiTicket是:" + jsApiTicket);
        return jsApiTicket;
    }

}

 

posted @ 2015-12-14 14:57  肖哥哥  阅读(2229)  评论(0编辑  收藏  举报
生命不息  奋斗不止  每天进步一点点