Heim  >  Artikel  >  Java  >  So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java

So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java

王林
王林nach vorne
2023-06-14 20:06:351464Durchsuche
Inhaltsverzeichnis
  • Teil Eins: Eine kurze Zusammenfassung gängiger Konfigurationen von HTTP-Anfragen

  • Teil Zwei: Verwendung von JavaLibs HttpUtils

  • Teil Drei: Teilen Sie mit, wie HttpUtils gekapselt ist

HTTP Anfragen täglich Leben Es kommt während der Entwicklung ziemlich häufig vor. Heute werde ich Ihnen zeigen, wie man HttpUtils verwendet.

Lesen Sie diesen Artikel und Sie erhalten:

  • Eine kurze Zusammenfassung gängiger Konfigurationen von HTTP-Anfragen;

  • Wie man HttpUtils in JavaLib verwendet;

  • Wie man HTTP-Anfrage-Tool-Klassen kapselt.

Teil 1: Eine kurze Zusammenfassung gängiger Konfigurationen für HTTP-Anfragen

Hallo zusammen, in der Java-Entwicklung müssen wir häufig Schnittstellendienste aufrufen, die von Drittanbietern bereitgestellt werden. Nachfolgend finden Sie Ich bespreche häufige HTTP-Anfragen. Machen Sie eine Erklärung.

http bietet mehrere Anforderungsmethoden, um unseren täglichen Anforderungen gerecht zu werden. Erklären Sie zunächst die Anforderungsmethode:

  • GET

  • POST

  • PUT

  • PATCH

  • DELETE

In der RESTful-API-Entwicklung können wir unsere API-Schnittstelle basierend auf diesen Anforderungsmethoden entwerfen. Beispiel:

  • GET: Ressourcen abrufen

  • POST: Ressourcen senden

  • PUT: Komplette Ressourcen aktualisieren

  • PATCH: Einige Ressourcen aktualisieren

  • DELETE: Ressourcen löschen

Parameterformat

  • Formular

  • json

Andere

  • Timeout-Einstellung

Teil 2: HttpUtils mit JavaLib

Einfache Get-Anfrage.

System.out.println(HttpUtils.get("https://www.baidu.com"));

Antwortergebnis:

<!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%"So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in 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="So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java" > </p> </div> </div> </div> </body> </html>

Durch einen einfachen Versuch , zwei Punkte sind bewiesen:

Erstens kann es immer noch verwendet werden; zweitens erweist es sich als so einfach zu verwenden.

Wenn Sie aufgefordert werden, eine http-Anfrage handschriftlich zu verfassen, haben Sie möglicherweise eine Lücke in Ihrem Kopf und suchen nach verschiedenen Informationen.

Versuchen wir es mit einer anderen komplexen

Schnittstelle:

Schnittstellenadresse: https://erwin-api.fengwenyi.com/erwin/blog/page Anforderungsmethode: GET
Parameter: currentPage, pageSize
Parameterformat: form
Antwort: application/json

So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java

So verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java

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);
}

Antwortergebnis:

{
    "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"
            }
        ]
    }
}

Das Antwortergebnis entspricht immer noch den Erwartungen.

Natürlich gibt es bei HTTP noch andere Probleme wie Zeitüberschreitungen usw. Schauen wir uns das vollständige Anforderungsbeispiel an:

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);
}

Das Antwortergebnis ist das gleiche wie oben.

Teil 3: Teilen Sie mit, wie HttpUtils gekapselt ist

Zunächst entsprechen Request und Response HTTP-Anfragen und -Antworten: 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.Request🎜🎜🎜🎜com.fengwenyi.javalib.http.Response🎜🎜🎜🎜Darüber hinaus wird com.fengwenyi.javalib.http.Request.Option zum Speichern verwendet HTTP-Parameterkonfiguration. 🎜🎜Die Ideenquelle für diesen Teil ist Spring Cloud OpenFeign. 🎜🎜Um mit mehreren HTTP-Tools zur Implementierung von Anforderungen kompatibel zu sein, wird HttpClientFactory eingeführt. Andere Toolklassen müssen nur die HttpClient-Schnittstelle implementieren. 🎜🎜🎜🎜com.fengwenyi.javalib.http.client.HttpClient🎜🎜🎜🎜com.fengwenyi.javalib.http.client.HttpClientFactory🎜🎜🎜🎜Oak, schauen wir uns den Code an: 🎜🎜HttpUtils # ausführen🎜
Response execute(Request request, Request.Option option) throws IOException;
🎜HttpClientFactory#get🎜rrreee🎜Sie müssen also nur die Schnittstelle HttpClient#execute implementieren. 🎜rrreee

Das obige ist der detaillierte Inhalt vonSo verwenden Sie HttpUtils zum Senden von HTTP-Anfragen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen