Maison  >  Article  >  Java  >  Comment utiliser HttpUtils pour envoyer des requêtes HTTP en Java

Comment utiliser HttpUtils pour envoyer des requêtes HTTP en Java

王林
王林avant
2023-06-14 20:06:351464parcourir
Directory
  • Première partie : Un bref résumé des configurations courantes pour les requêtes HTTP

  • Part Deuxième : utiliser HttpUtils de JavaLib

  • Partie trois : Partagez comment HttpUtils est encapsulé Dans le développement quotidien, c'est assez courant. Aujourd'hui, je vais partager avec vous comment utiliser HttpUtils.

  • Après avoir lu cet article, vous obtiendrez :

Un bref résumé des configurations courantes pour les requêtes HTTP

#🎜🎜 ; #
  • Comment utiliser HttpUtils dans JavaLib ;

  • Comment encapsuler la classe d'outil de requête HTTP.

  • Première partie : Un bref résumé des configurations courantes pour les requêtes HTTP

    Bonjour à tous, en développement Java, nous rencontrons souvent le besoin d'appeler fourni par un tiers La forme courante de service d'interface est HTTP + JSON. Ci-dessous, nous expliquerons les paramètres courants des requêtes http.
http fournit une variété de méthodes de requête pour répondre à nos besoins quotidiens. appuyez sur la méthode de demande. Faites une description :

# 🎜🎜#PUT

PATCH

  • DELETE

    #🎜 🎜 ##🎜 🎜#
  • Dans le développement d'API RESTful, nous pouvons concevoir notre interface API basée sur ces méthodes de requête. Exemple :
  • GET : Obtenir des ressources
  • POST : Soumettre des ressources
  • PUT : Mettre à jour les ressources complètes
  • PATCH : Mettre à jour certaines ressources

    SUPPRIMER : Supprimer la ressource
  • Format du paramètre
  • formulaire
  • #🎜 🎜#

    json
  • Autre
  • Réglage du délai d'attente
  • #🎜🎜 #

Partie 2 : HttpUtils utilisant JavaLib

    Demande d'obtention simple
  • System.out.println(HttpUtils.get("https://www.baidu.com"));

    Résultat de la réponse :

    <!DOCTYPE html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img  hidefocus=true src=//www.baidu.com/img/bd_logo1.png    style="max-width:90%"Comment utiliser HttpUtils pour envoyer des requêtes HTTP en Java" > </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write(&#39;<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=&#39;+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ &#39;" name="tj_login" class="lb">登录</a>&#39;);                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri >更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a>  <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号  <img  src=//www.baidu.com/img/gs.gif alt="Comment utiliser HttpUtils pour envoyer des requêtes HTTP en Java" > </p> </div> </div> </div> </body> </html>
  • Grâce à une simple tentative , deux points sont prouvés :
  • Premièrement, cela peut toujours être utilisé ; deuxièmement, il s'avère si simple à utiliser ;

  • Si on vous demande de rédiger une requête http à la main, peut-être aurez-vous un vide en tête et rechercherez diverses informations.

Essayons un autre complexe

    Interface :
  • Adresse de l'interface : https://erwin-api.fengwenyi.com/erwin/blog /page méthode de requête : GET

    Paramètres : currentPage, pageSize
  • Format du paramètre : form
Réponse : application/json

#🎜 🎜#

String url = "https://erwin-api.fengwenyi.com/erwin/bookmark/page?currentPage=1&pageSize=10";
Request request = new Request();
request.setUrl(url);
request.setMethod(Request.Method.GET);
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Accept", "application/json");
Request.Option option = new Request.Option();
option.setHeaders(headerMap);
try {
    System.out.println(HttpUtils.execute(request, option));
} catch (IOException e) {
    throw new RuntimeException(e);
}

Résultat de la réponse :

{
    "code":"SUCCESS",
    "message":"Success",
    "success":true,
    "header":null,
    "body":{
        "currentPage":1,
        "pageSize":10,
        "totalRows":661,
        "totalPages":67,
        "content":[
            {
                "id":"1634772578877935617",
                "timestamp":1678595130000,
                "enabledState":null,
                "name":"VScode 中文显示出现黄色方框的解决方法_vscode汉字被框住_YJer的博客-CSDN博客",
                "url":"https://blog.csdn.net/qq_33249042/article/details/123252625",
                "icon":null,
                "classifyName":"软件",
                "classifyId":"1522587269600481281"
            },
            {
                "id":"1632640455110922241",
                "timestamp":1678086792000,
                "enabledState":null,
                "name":"Spring中init-method和destroy-method的四种方式_星夜孤帆的博客-CSDN博客",
                "url":"https://blog.csdn.net/qq_38826019/article/details/117387398",
                "icon":null,
                "classifyName":"Spring",
                "classifyId":"1522586360887742466"
            },
            {
                "id":"1631597310596190209",
                "timestamp":1677838087000,
                "enabledState":null,
                "name":"vue3 + elemenplus实现导航栏 - 掘金",
                "url":"https://juejin.cn/post/7084871748608327687",
                "icon":null,
                "classifyName":"前端",
                "classifyId":"1525554881275990018"
            },
            {
                "id":"1631593154401636354",
                "timestamp":1677837096000,
                "enabledState":null,
                "name":"Spring bean 创建过程源码解析 - 腾讯云开发者社区-腾讯云",
                "url":"https://cloud.tencent.com/developer/article/1631160",
                "icon":null,
                "classifyName":"Spring",
                "classifyId":"1522586360887742466"
            },
            {
                "id":"1631592987673858050",
                "timestamp":1677837056000,
                "enabledState":null,
                "name":"SpringBoot之容器启动源码分析与Bean加载_springboot加载bean 源码_minemine0418的博客-CSDN博客",
                "url":"https://blog.csdn.net/minemine0418/article/details/102308912",
                "icon":null,
                "classifyName":"Spring Boot",
                "classifyId":"1522586446766116865"
            },
            {
                "id":"1631586585454678018",
                "timestamp":1677835530000,
                "enabledState":null,
                "name":"Spring-Bean生命周期 - 知乎",
                "url":"https://zhuanlan.zhihu.com/p/158468104",
                "icon":null,
                "classifyName":"Spring",
                "classifyId":"1522586360887742466"
            },
            {
                "id":"1631579732104548354",
                "timestamp":1677833896000,
                "enabledState":null,
                "name":"一文读懂 Spring Bean 的生命周期_spring bean的生命周期_老周聊架构的博客-CSDN博客",
                "url":"https://blog.csdn.net/riemann_/article/details/118500805",
                "icon":null,
                "classifyName":"Spring",
                "classifyId":"1522586360887742466"
            },
            {
                "id":"1630768897186697218",
                "timestamp":1677640578000,
                "enabledState":null,
                "name":"MySQL同时统计多个条件的记录条数_ztnhnr的博客-CSDN博客",
                "url":"https://blog.csdn.net/ztnhnr/article/details/107165942",
                "icon":null,
                "classifyName":"MySQL",
                "classifyId":"1522586805693681666"
            },
            {
                "id":"1630768792098410497",
                "timestamp":1677640553000,
                "enabledState":null,
                "name":"sql查询近七天,近两周,近一个月的数据_sql最近一周数据_心诚则灵'的博客-CSDN博客",
                "url":"https://blog.csdn.net/wenchangwenliu/article/details/119891790",
                "icon":null,
                "classifyName":"MySQL",
                "classifyId":"1522586805693681666"
            },
            {
                "id":"1630480535938764801",
                "timestamp":1677571827000,
                "enabledState":null,
                "name":"开源流程引擎哪个好,如何选型? - 知乎",
                "url":"https://zhuanlan.zhihu.com/p/369761832",
                "icon":null,
                "classifyName":"Java",
                "classifyId":"1522586296119300097"
            }
        ]
    }
}

Le résultat de la réponse est toujours conforme aux attentes.

Bien sûr, il y a d'autres choses dans HTTP, comme les délais d'attente, etc. Jetons un coup d'œil à l'exemple de requête complète :

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("currentPage", 1);
paramMap.put("pageSize", 10);
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Accept", "application/json");
Request request = new Request();
request.setUrl("https://erwin-api.fengwenyi.com/erwin/bookmark/page");
request.setParam(paramMap);
request.setMethod(Request.Method.GET);
request.setUtil(Request.Util.OkHttp);
Request.Option option = new Request.Option();
option.setHeaders(headerMap);
option.setConnectTimeoutSecond(3);
option.setReadTimeoutSecond(5);
option.setLogLevel(Request.LogLevel.DEBUG);
try {
    String result = HttpUtils.execute(request, option);
    System.out.println(result);
} catch (IOException e) {
    throw new RuntimeException(e);
}

Le résultat de la réponse est le même que au-dessus de.

Partie 3 : Partagez comment HttpUtils est encapsulé

Tout d'abord, Request et Response correspondent aux requêtes HTTP et en réponse , le chemin du package est le suivant :


com.fengwenyi.javalib.http.Request

Comment utiliser HttpUtils pour envoyer des requêtes HTTP en Java

com .fengwenyi .javalib.http.ResponseComment utiliser HttpUtils pour envoyer des requêtes HTTP en Java

De plus, com.fengwenyi.javalib.http.Request.Option est utilisé pour stocker HTTP configuration des paramètres.

La source d'idées pour cette partie est Spring Cloud OpenFeign.

Afin d'être compatible avec plusieurs outils HTTP pour implémenter les requêtes, HttpClientFactory est introduit. D'autres classes d'outils doivent uniquement implémenter l'interface HttpClient.

com.fengwenyi.javalib.http.client.HttpClient

RequestResponse 对应HTTP的请求和响应,包路径如下:

  • com.fengwenyi.javalib.http.Request

  • com.fengwenyi.javalib.http.Response

另外,com.fengwenyi.javalib.http.Request.Option 来存放HTTP参数配置。

这一部分的思路来源是 Spring Cloud OpenFeign。

为了兼容多种HTTP工具实现请求,引入了 HttpClientFactory,其他工具类,只要实现 HttpClient 接口,就行。

  • com.fengwenyi.javalib.http.client.HttpClient

  • com.fengwenyi.javalib.http.client.HttpClientFactory

欧克,下面我们就以代码来看看:

HttpUtils#execute

public static String execute(Request request, Request.Option option) throws IOException {
    check(request);
    HttpClient httpClient = HttpClientFactory.get(request.getUtil());
    Response response = httpClient.execute(request, option);
    return handleResponse(response);
}

HttpClientFactory#get

public static HttpClient get(Request.Util httpUtil) {
    if (Request.Util.JDK == httpUtil) {
        return new JdkHttpClient();
    } else if (Request.Util.OkHttp == httpUtil) {
        return new OkHttpClient();
    } else {
        throw new RuntimeException("not find http util: " + httpUtil.name());
    }
}

所以,只需要实现 HttpClient#execute

#🎜🎜#com.fengwenyi.javalib.http .client.HttpClientFactory#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Ok, jetons un œil au code : #🎜🎜##🎜🎜#HttpUtils#execute#🎜🎜#
Response execute(Request request, Request.Option option) throws IOException;
#🎜 🎜# HttpClientFactory#get#🎜🎜#rrreee#🎜🎜#Donc, il vous suffit d'implémenter l'interface HttpClient#execute. #🎜🎜#rrreee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer