前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【原生态】Http请求数据 与 发送数据

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

作者头像
肖哥哥
发布2019-02-22 10:15:16
5340
发布2019-02-22 10:15:16
举报

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

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

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

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

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

代码语言:javascript
复制
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;
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档