httpClient方式使用httpGet调用外部的api

1.使用

/**
     * vip 小程序 登陆解码过程
     */
    @ApiOperation("vip 小程序 登录凭证校验")
    @RequestMapping(value="/code2Session" , method = RequestMethod.GET)
    Code2SessionFromWeiXinResponse code2Session(
            @RequestParam("appid") String  appid,  //小程序 appId
            @RequestParam("secret") String  secret, //小程序 appSecret
            @RequestParam("js_code") String  js_code, //登录时获取的 code
            @RequestParam(value = "grant_type",defaultValue = "authorization_code") String grant_type //授权类型,此处只需填写 authorization_code
    )
    {
        //请求:GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
        Code2SessionFromWeiXinResponse res=new Code2SessionFromWeiXinResponse();

        HttpGetRequest request=new HttpGetRequest();
        request.setUrl("https://api.weixin.qq.com/sns/jscode2session");

        Map<String,String> paramMap=new HashMap<>();
        paramMap.put("appid",appid);
        paramMap.put("secret",secret);
        paramMap.put("js_code",js_code);
        paramMap.put("grant_type",grant_type);

        request.setParamMap(paramMap);

        //code2Session
        JSONObject httpResponse= httpGetAdapter.httpGetMethod(request);

        logger.info("http请求返回值:{}"+httpResponse);

        if(httpResponse!=null){

            if (httpResponse.has("errcode")) {  //判断JSONObject是否包含含有openid属性值
                res.setErrcode(httpResponse.getLong("errcode"));
            }
            if (httpResponse.has("openid")) {
                res.setOpenid(httpResponse.getString("openid"));
            }

            if(httpResponse.has("errmsg")){
                res.setErrmsg(httpResponse.getString("errmsg"));
            }
            if(httpResponse.has("unionid")){
                res.setUnionid(httpResponse.getString("unionid"));
            }
            if(httpResponse.has("session_key")){
                res.setSession_key(httpResponse.getString("session_key"));
            }
        }

        return res;
    }

2.httpGetAdapter

package com.fangdd.esf.web.server.adapter;

import com.fangdd.esf.web.server.entity.HttpGetRequest;
import org.apache.commons.collections.MapUtils;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.json.JSONObject;

import java.net.URISyntaxException;
import java.util.Map;

@Component
public class HttpGetAdapter {

    private static final Logger logger = LoggerFactory.getLogger(HttpGetAdapter.class);

    /**
     * 调用外部的http 接口,get请求
     * @param request
     * @return
     */
    public JSONObject httpGetMethod(HttpGetRequest request) {

        //返回数据
        JSONObject responseBody=new JSONObject();
        //response
        HttpResponse response = null;
        //httpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            logger.debug("code2Session with request {}", request);
            // get method
            URIBuilder uriBuilder = new URIBuilder(request.getUrl());

            Map<String,String> paramMap= request.getParamMap();//参数map
            if(MapUtils.isNotEmpty(paramMap)){
                for (Map.Entry<String, String> entry : paramMap.entrySet()) {
                    uriBuilder.addParameter(entry.getKey(), entry.getValue());
                }
            }
            // 根据带参数的URI对象构建GET请求对象
            HttpGet httpGet = new HttpGet(uriBuilder.build());

            response = httpClient.execute(httpGet); //执行返回的结果

            // 获取response 的body
            String resBody = EntityUtils.toString(response.getEntity(),"UTF-8");
            // /** 将String数组转为JSON*/
            responseBody = new JSONObject(resBody);

//            HttpEntity entity = response.getEntity();
//            ret=EntityUtils.toString(entity,"UTF-8");

        } catch (ParseException e) {
            System.err.println("解析错误");
            e.printStackTrace();
        } catch (URISyntaxException e) {
            System.err.println("URI解析异常");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放连接
            if (null != response) {
                try {
                    httpClient.close();
                } catch (Exception e) {
                    System.err.println("释放连接出错");
                    e.printStackTrace();
                }
            }
        }
        logger.debug("The response is {}", response);

        return responseBody;
    }
}

3.request

package com.fangdd.esf.web.server.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Map;

@Data
@ApiModel(description = "httpGet方法request")
public class HttpGetRequest implements Serializable {

    //https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
    @ApiModelProperty(value = "url")
    private String url;

    @ApiModelProperty(value = "参数map")
    private Map<String,String> paramMap;



}

4.response

package com.fangdd.esf.web.server.entity.brandStore;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
@ApiModel(description = "微信登录凭证校验response")
public class Code2SessionFromWeiXinResponse implements Serializable {

    @ApiModelProperty(value = "用户唯一标识")
    private String openid;

    @ApiModelProperty(value = "会话密钥")
    private String session_key;

    @ApiModelProperty(value = "用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回")
    private String unionid;

    @ApiModelProperty(value = "错误码")
    private Long errcode;

    /**
     * errcode 的合法值
     *
     * -1  系统繁忙,此时请开发者稍候再试
     * 0   请求成功
     * 40029   code 无效
     * 45011   频率限制,每个用户每分钟100次
     */

    @ApiModelProperty(value = "错误信息")
    private String errmsg;
}
原创文章 75 获赞 28 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_33999844/article/details/85698196