• java使用Http调用第三方接口,输入链接,获取返回值


    【Htpp工具类更新/2019-12-17】:增加多种调用方法,以及请求头调用等等

    最近公司给了一个第三方服务的网址,要我调用后返回需要用到的信息

    具体网址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + userId+ "&type=1&sceneId=sceneld

    直接再网页上显示:

    {"longTable":[{"labelName":"message","labelValue":"1507.68","unit":"M"}],"customGroup":[],"crossTable":[]}

    后台需要获取并解析
    说一下我的实现思路:用http获取页面信息
    为方便起见,我把这个封装成一个工具类了
    接下来,献上我的工具类,工具类已更新2019-12-17,增强版,重新录入许多方法
      1 import org.slf4j.Logger;
      2 import org.slf4j.LoggerFactory;
      3 import java.io.*;
      4 import java.net.HttpURLConnection;
      5 import java.net.URL;
      6 import java.util.Map;
      7 import java.util.Set;
      8 
      9 /**
     10  * @author wusiwee
     11  * @date 2019/12/17 16:50
     12  */
     13 public class HttpUtil {
     14 
     15     private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
     16 
     17 
     18     /**
     19      * 支持的Http method
     20      */
     21     private static enum HttpMethod {
     22         POST, DELETE, GET, PUT, HEAD
     23     }
     24 
     25     @SuppressWarnings({"unchecked", "rawtypes"})
     26     private static String invokeUrl(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String encoding, HttpMethod method) {
     27         //构造请求参数字符串
     28         StringBuilder paramsStr = null;
     29         if (params != null) {
     30             paramsStr = new StringBuilder();
     31             Set<Map.Entry> entries = params.entrySet();
     32             for (Map.Entry entry : entries) {
     33                 String value = (entry.getValue() != null) ? (String.valueOf(entry.getValue())) : "";
     34                 paramsStr.append(entry.getKey() + "=" + value + "&");
     35             }
     36             //只有POST方法才能通过OutputStream(即form的形式)提交参数
     37             if (method != HttpMethod.POST) {
     38                 url += "?" + paramsStr.toString();
     39             }
     40         }
     41 
     42         URL uUrl = null;
     43         HttpURLConnection conn = null;
     44         BufferedWriter out = null;
     45         BufferedReader in = null;
     46         try {
     47             //创建和初始化连接
     48             uUrl = new URL(url);
     49             conn = (HttpURLConnection) uUrl.openConnection();
     50             conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
     51             conn.setRequestMethod(method.toString());
     52             conn.setDoOutput(true);
     53             conn.setDoInput(true);
     54             //设置连接超时时间
     55             conn.setConnectTimeout(connectTimeout);
     56             //设置读取超时时间
     57             conn.setReadTimeout(readTimeout);
     58             //指定请求header参数
     59             if (headers != null && headers.size() > 0) {
     60                 Set<String> headerSet = headers.keySet();
     61                 for (String key : headerSet) {
     62                     conn.setRequestProperty(key, headers.get(key));
     63                 }
     64             }
     65 
     66             if (paramsStr != null && method == HttpMethod.POST) {
     67                 //发送请求参数
     68                 out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), encoding));
     69                 out.write(paramsStr.toString());
     70                 out.flush();
     71             }
     72 
     73             //接收返回结果
     74             StringBuilder result = new StringBuilder();
     75             in = new BufferedReader(new InputStreamReader(conn.getInputStream(), encoding));
     76             if (in != null) {
     77                 String line = "";
     78                 while ((line = in.readLine()) != null) {
     79                     result.append(line);
     80                 }
     81             }
     82             return result.toString();
     83         } catch (Exception e) {
     84             logger.error("调用接口[" + url + "]失败!请求URL:" + url + ",参数:" + params, e);
     85             //处理错误流,提高http连接被重用的几率
     86             try {
     87                 byte[] buf = new byte[100];
     88                 InputStream es = conn.getErrorStream();
     89                 if (es != null) {
     90                     while (es.read(buf) > 0) {
     91                         ;
     92                     }
     93                     es.close();
     94                 }
     95             } catch (Exception e1) {
     96                 e1.printStackTrace();
     97             }
     98         } finally {
     99             try {
    100                 if (out != null) {
    101                     out.close();
    102                 }
    103             } catch (Exception e) {
    104                 e.printStackTrace();
    105             }
    106             try {
    107                 if (in != null) {
    108                     in.close();
    109                 }
    110             } catch (Exception e) {
    111                 e.printStackTrace();
    112             }
    113             //关闭连接
    114             if (conn != null) {
    115                 conn.disconnect();
    116             }
    117         }
    118         return null;
    119     }
    120 
    121     /**
    122      * POST方法提交Http请求,语义为“增加” <br/>
    123      * 注意:Http方法中只有POST方法才能使用body来提交内容
    124      *
    125      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    126      * @param params         参数
    127      * @param connectTimeout 连接超时时间(单位为ms)
    128      * @param readTimeout    读取超时时间(单位为ms)
    129      * @param charset        字符集(一般该为“utf-8”)
    130      * @return
    131      */
    132     public static String post(String url, Map params, int connectTimeout, int readTimeout, String charset) {
    133         return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.POST);
    134     }
    135 
    136     /**
    137      * POST方法提交Http请求,语义为“增加” <br/>
    138      * 注意:Http方法中只有POST方法才能使用body来提交内容
    139      *
    140      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    141      * @param params         参数
    142      * @param headers        请求头参数
    143      * @param connectTimeout 连接超时时间(单位为ms)
    144      * @param readTimeout    读取超时时间(单位为ms)
    145      * @param charset        字符集(一般该为“utf-8”)
    146      * @return
    147      */
    148     public static String post(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) {
    149         return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.POST);
    150     }
    151 
    152     /**
    153      * GET方法提交Http请求,语义为“查询”
    154      *
    155      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    156      * @param params         参数
    157      * @param connectTimeout 连接超时时间(单位为ms)
    158      * @param readTimeout    读取超时时间(单位为ms)
    159      * @param charset        字符集(一般该为“utf-8”)
    160      * @return
    161      */
    162     public static String get(String url, Map params, int connectTimeout, int readTimeout, String charset) {
    163         return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.GET);
    164     }
    165 
    166     /**
    167      * GET方法提交Http请求,语义为“查询”
    168      *
    169      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    170      * @param params         参数
    171      * @param headers        请求头参数
    172      * @param connectTimeout 连接超时时间(单位为ms)
    173      * @param readTimeout    读取超时时间(单位为ms)
    174      * @param charset        字符集(一般该为“utf-8”)
    175      * @return
    176      */
    177     public static String get(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) {
    178         return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.GET);
    179     }
    180 
    181     /**
    182      * PUT方法提交Http请求,语义为“更改” <br/>
    183      * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
    184      *
    185      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    186      * @param params         参数
    187      * @param connectTimeout 连接超时时间(单位为ms)
    188      * @param readTimeout    读取超时时间(单位为ms)
    189      * @param charset        字符集(一般该为“utf-8”)
    190      * @return
    191      */
    192     public static String put(String url, Map params, int connectTimeout, int readTimeout, String charset) {
    193         return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.PUT);
    194     }
    195 
    196     /**
    197      * PUT方法提交Http请求,语义为“更改” <br/>
    198      * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
    199      *
    200      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    201      * @param params         参数
    202      * @param headers        请求头参数
    203      * @param connectTimeout 连接超时时间(单位为ms)
    204      * @param readTimeout    读取超时时间(单位为ms)
    205      * @param charset        字符集(一般该为“utf-8”)
    206      * @return
    207      */
    208     public static String put(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) {
    209         return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.PUT);
    210     }
    211 
    212     /**
    213      * DELETE方法提交Http请求,语义为“删除”
    214      *
    215      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    216      * @param params         参数
    217      * @param connectTimeout 连接超时时间(单位为ms)
    218      * @param readTimeout    读取超时时间(单位为ms)
    219      * @param charset        字符集(一般该为“utf-8”)
    220      * @return
    221      */
    222     public static String delete(String url, Map params, int connectTimeout, int readTimeout, String charset) {
    223         return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.DELETE);
    224     }
    225 
    226     /**
    227      * DELETE方法提交Http请求,语义为“删除”
    228      *
    229      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    230      * @param params         参数
    231      * @param headers        请求头参数
    232      * @param connectTimeout 连接超时时间(单位为ms)
    233      * @param readTimeout    读取超时时间(单位为ms)
    234      * @param charset        字符集(一般该为“utf-8”)
    235      * @return
    236      */
    237     public static String delete(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) {
    238         return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.DELETE);
    239     }
    240 
    241     /**
    242      * HEAD方法提交Http请求,语义同GET方法  <br/>
    243      * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
    244      *
    245      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    246      * @param params         参数
    247      * @param connectTimeout 连接超时时间(单位为ms)
    248      * @param readTimeout    读取超时时间(单位为ms)
    249      * @param charset        字符集(一般该为“utf-8”)
    250      * @return
    251      */
    252     public static String head(String url, Map params, int connectTimeout, int readTimeout, String charset) {
    253         return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.HEAD);
    254     }
    255 
    256     /**
    257      * HEAD方法提交Http请求,语义同GET方法  <br/>
    258      * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
    259      *
    260      * @param url            资源路径(如果url中已经包含参数,则params应该为null)
    261      * @param params         参数
    262      * @param headers        请求头参数
    263      * @param connectTimeout 连接超时时间(单位为ms)
    264      * @param readTimeout    读取超时时间(单位为ms)
    265      * @param charset        字符集(一般该为“utf-8”)
    266      * @return
    267      */
    268     public static String head(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) {
    269         return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.HEAD);
    270     }
    271 
    272     public static void main(String[] args) {
    273         //Map params = new HashMap();
    274         //params.put("phoneNo", "中文");
    275         //String str = HttpUtil.get("http://localhost:9092/elis_smp_als_dmz/do/app/activitySupport/demo", params, 3000, 3000, "UTF-8");
    276         //System.out.println(str);
    277     }
    278 
    279 }

    方法我已经声明为static,调用直接 类名.方法名 HttpUtil.getURLContent(String URL);

    就直接返回字符串了

    若要json字符串与java对象进行相互转换,我使用的fastjson转换,再献上我的工具类

    pom文件导包:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.21</version>
    </dependency>

    JsonUtil的工具类:

     1 import com.alibaba.fastjson.JSON;
     2 import com.alibaba.fastjson.JSONObject;
     3 
     4 public final class JsonUtils {
     5     /**
     6      * 把Java对象转换成json字符串
     7      *
     8      * @param object 待转化为JSON字符串的Java对象
     9      * @return json 串 or null
    10      */
    11     public static <T> String parseObjToJson(T object) {
    12         String string = null;
    13         try {
    14             //string = JSON.toJSONString(object);
    15             string = JSONObject.toJSONString(object);
    16         } catch (Exception e) {
    17             System.out.println(e.getMessage());
    18         }
    19         return string;
    20     }
    21 
    22     /**
    23      * 将Json字符串信息转换成对应的Java对象
    24      *
    25      * @param json json字符串对象
    26      * @param c    对应的类型
    27      */
    28     public static <T> T parseJsonToObj(String json, Class<T> c) {
    29         try {
    30             //两个都是可行的,起码我测试的时候是没问题的。
    31             //JSONObject jsonObject = JSONObject.parseObject(json);
    32             JSONObject jsonObject = JSON.parseObject(json);
    33             return JSON.toJavaObject(jsonObject, c);
    34         } catch (Exception e) {
    35             System.out.println(e.getMessage());
    36         }
    37         return null;
    38     }
    39 
    40 }
    JSONUtil工具类

    关于工具类的方法调用  上面我已经说了,这个不用我说了吧

    恭喜 解析成功

  • 相关阅读:
    UWP中实现大爆炸效果(二)
    UWP中实现大爆炸效果(一)
    c# 【电影搜索引擎】采集电影站源码
    安利一个聚合搜索导航站,及怎么样设置成默认的搜索引擎
    女朋友经常问影视剧, 答不上来怎么办?
    宝塔linux面板, 服务器日志分析与流量统计这款插件的mysql版优化。
    苹果cms自动采集,重复执行遇到“上次执行时间: --跳过”的解决办法
    苹果cms, 后台设置保存不了的解决办法
    解决 C:WINDOWSsystem32inetsrv ewrite.dll 未能加载。返回的数据为错误.
    img error 图片加载失败的最佳方案
  • 原文地址:https://www.cnblogs.com/wusiwee/p/10370551.html
Copyright © 2020-2023  润新知