java遠(yuǎn)程調(diào)用接口、URL的方式代碼
一:httpUrlConnection
1.獲取HttpURLConnection連接對(duì)象
/** * 獲取HttpURLConnection連接對(duì)象 * @param url 遠(yuǎn)程調(diào)用的url * @return */ public static HttpURLConnection getHttpURLConnection(String url){ try { //建立連接 URL httpUrl = new URL(url); HttpURLConnection urlConnection =(HttpURLConnection)httpUrl.openConnection(); //向文件所在服務(wù)器發(fā)送標(biāo)識(shí)信息,模擬瀏覽器 urlConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"); return urlConnection; } catch (IOException e) { e.printStackTrace(); return null; } }
2.遠(yuǎn)程調(diào)用代碼
/** * 遠(yuǎn)程調(diào)用登錄接口 */ public void accessLoginUrl(){ //遠(yuǎn)程調(diào)用接口的url String loginUrl = "http://localhost:8989/login/doLogin"; OutputStream outputStream = null; InputStream inputStream = null; ByteArrayOutputStream byteArrayOutputStream = null; try { //獲取壓測(cè)接口的userTicket URL url = new URL(loginUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //登錄是post請(qǐng)求 connection.setRequestMethod("POST"); //post請(qǐng)求需要設(shè)置接口返回的數(shù)據(jù),所以設(shè)置為true connection.setDoOutput(true); //參數(shù)userId和密碼 String param = "mobile=" + 13100000000000L + "&password=" + "123456"; //獲取登錄接口返回的流文件 outputStream = connection.getOutputStream(); outputStream.write(param.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); inputStream = connection.getInputStream(); byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) >= 0){ byteArrayOutputStream.write(buffer, 0, len); } //獲取響應(yīng)結(jié)果 String response = byteArrayOutputStream.toString(); ObjectMapper objectMapper = new ObjectMapper(); RespBean respBean = objectMapper.readValue(response, RespBean.class); String userTicket = (String) respBean.getObject(); System.out.println("遠(yuǎn)程調(diào)用接口的返回值"+userTicket); //userTicket就是遠(yuǎn)程接口返回的值 } catch (IOException e) { e.printStackTrace(); } finally { if(byteArrayOutputStream != null){ try { byteArrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(outputStream != null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
二:RestTemplate
2.1 什么是RestTemplate
1.spring 框架提供的 RestTemplate 類(lèi)可用于在應(yīng)用中調(diào)用 rest 服務(wù),它簡(jiǎn)化了與 http 服務(wù)的通信方式,統(tǒng)一了 RESTful 的標(biāo)準(zhǔn),封裝了 http 鏈接, 我們只需要傳入 url 及返回值類(lèi)型即可。相較于之前常用的 HttpClient,RestTemplate 是一種更優(yōu)雅的調(diào)用 RESTful 服務(wù)的方式。
2.在 Spring 應(yīng)用程序中訪問(wèn)第三方 REST 服務(wù)與使用 Spring RestTemplate 類(lèi)有關(guān)。RestTemplate 類(lèi)的設(shè)計(jì)原則與許多其他 Spring 模板類(lèi)(例如 JdbcTemplate、JmsTemplate)相同,為執(zhí)行復(fù)雜任務(wù)提供了一種具有默認(rèn)行為的簡(jiǎn)化方法。
3.RestTemplate 默認(rèn)依賴(lài) JDK 提供 http 連接的能力(HttpURLConnection),如果有需要的話也可以通過(guò) setRequestFactory 方法替換為例如 Apache HttpComponents、Netty 或 OkHttp 等其它 HTTP library。
4.考慮到 RestTemplate 類(lèi)是為調(diào)用 REST 服務(wù)而設(shè)計(jì)的,因此它的主要方法與 REST 的基礎(chǔ)緊密相連就不足為奇了,后者是 HTTP 協(xié)議的方法:HEAD、GET、POST、PUT、DELETE 和 OPTIONS。例如,RestTemplate 類(lèi)具有 headForHeaders()、getForObject()、postForObject()、put()和 delete()等方法。
2.2 配置RestTemplate
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); //解決401報(bào)錯(cuò)時(shí),報(bào)java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode requestFactory.setOutputStreaming(false); RestTemplate restTemplate = new RestTemplate(requestFactory); restTemplate.setErrorHandler(new RtErrorHandler()); return restTemplate; } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000); factory.setConnectTimeout(15000); return factory; }
2.2 RestTemplate 添加請(qǐng)求頭headers和請(qǐng)求體body
HttpHeaders header = new HttpHeaders(); header.add("X-Consumer-Third-User-Id", "X-Consumer-Third-User-Id"); header.add("X-Consumer-Third-User-Name", "X-Consumer-Third-User-Name"); header.set("Authorization", "authorization"); HttpEntity<AssetProcessVo> httpEntity = new HttpEntity<>(assetProcessVo, header);
- header 為需要設(shè)置的請(qǐng)求頭
- AssetProcessVo為需要遠(yuǎn)程調(diào)用接口傳遞的參數(shù)
2.3 示例代碼
/** * 遠(yuǎn)程調(diào)用登錄接口 */ public void accessLoginUrl(){ HttpHeaders header = new HttpHeaders(); header.add("X-Consumer-Third-User-Id", "X-Consumer-Third-User-Id"); header.add("X-Consumer-Third-User-Name", "X-Consumer-Third-User-Name"); header.set("Authorization", "authorization"); HttpEntity<AssetProcessVo> httpEntity = new HttpEntity<>(assetProcessVo, header); ResponseEntity<ByteArrayOutputStream> exchange; try { //保存案件名稱(chēng)后,啟動(dòng)工作流 exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, ByteArrayOutputStream.class); if (exchange.getStatusCodeValue() == 200) { String response = byteArrayOutputStream.toString(); ObjectMapper objectMapper = new ObjectMapper(); RespBean respBean = objectMapper.readValue(response, RespBean.class); } } catch (RestClientException e) { e.printStackTrace(); }
三:HttpClient
3.1 導(dǎo)入依賴(lài)
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency>
3.2 使用方法
1,創(chuàng)建HttpClient對(duì)象;
2,指定請(qǐng)求URL,并創(chuàng)建請(qǐng)求對(duì)象,如果是get請(qǐng)求則創(chuàng)建HttpGet對(duì)象,post則創(chuàng)建HttpPost對(duì)象;
3,如果請(qǐng)求帶有參數(shù),對(duì)于get請(qǐng)求可直接在URL中加上參數(shù)請(qǐng)求,或者使用setParam(HetpParams params)方法設(shè)置參數(shù),對(duì)于HttpPost請(qǐng)求,可使用setParam(HetpParams params)方法或者調(diào)用setEntity(HttpEntity entity)方法設(shè)置參數(shù);
4,調(diào)用httpClient的execute(HttpUriRequest request)執(zhí)行請(qǐng)求,返回結(jié)果是一個(gè)response對(duì)象;
5,通過(guò)response的getHeaders(String name)或getAllHeaders()可獲得請(qǐng)求頭部信息,getEntity()方法獲取HttpEntity對(duì)象,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容。
3.3 代碼實(shí)現(xiàn)
package com.cnzz.demo.remote.rpc; import com.alibaba.fastjson.JSONObject; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import java.io.IOException; /** * ************************************************************ * Copyright ? 2020 cnzz Inc.All rights reserved. * ** * ************************************************************ * * @program: demo * @description: * @author: cnzz * @create: 2020-12-23 17:41 **/ public class HttpClientUtil { /** * httpClient的get請(qǐng)求方式 * 使用GetMethod來(lái)訪問(wèn)一個(gè)URL對(duì)應(yīng)的網(wǎng)頁(yè)實(shí)現(xiàn)步驟: * 1.生成一個(gè)HttpClient對(duì)象并設(shè)置相應(yīng)的參數(shù); * 2.生成一個(gè)GetMethod對(duì)象并設(shè)置響應(yīng)的參數(shù); * 3.用HttpClient生成的對(duì)象來(lái)執(zhí)行GetMethod生成的Get方法; * 4.處理響應(yīng)狀態(tài)碼; * 5.若響應(yīng)正常,處理HTTP響應(yīng)內(nèi)容; * 6.釋放連接。 * @param url * @param charset * @return */ public static String doGet(String url, String charset) { //1.生成HttpClient對(duì)象并設(shè)置參數(shù) HttpClient httpClient = new HttpClient(); //設(shè)置Http連接超時(shí)為5秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); //2.生成GetMethod對(duì)象并設(shè)置參數(shù) GetMethod getMethod = new GetMethod(url); //設(shè)置get請(qǐng)求超時(shí)為5秒 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); //設(shè)置請(qǐng)求重試處理,用的是默認(rèn)的重試處理:請(qǐng)求三次 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); String response = ""; //3.執(zhí)行HTTP GET 請(qǐng)求 try { int statusCode = httpClient.executeMethod(getMethod); //4.判斷訪問(wèn)的狀態(tài)碼 if (statusCode != HttpStatus.SC_OK) { System.err.println("請(qǐng)求出錯(cuò):" + getMethod.getStatusLine()); } //5.處理HTTP響應(yīng)內(nèi)容 //HTTP響應(yīng)頭部信息,這里簡(jiǎn)單打印 Header[] headers = getMethod.getResponseHeaders(); for(Header h : headers) { System.out.println(h.getName() + "---------------" + h.getValue()); } //讀取HTTP響應(yīng)內(nèi)容,這里簡(jiǎn)單打印網(wǎng)頁(yè)內(nèi)容 //讀取為字節(jié)數(shù)組 byte[] responseBody = getMethod.getResponseBody(); response = new String(responseBody, charset); System.out.println("-----------response:" + response); //讀取為InputStream,在網(wǎng)頁(yè)內(nèi)容數(shù)據(jù)量大時(shí)候推薦使用 //InputStream response = getMethod.getResponseBodyAsStream(); } catch (HttpException e) { //發(fā)生致命的異常,可能是協(xié)議不對(duì)或者返回的內(nèi)容有問(wèn)題 System.out.println("請(qǐng)檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { //發(fā)生網(wǎng)絡(luò)異常 System.out.println("發(fā)生網(wǎng)絡(luò)異常!"); } finally { //6.釋放連接 getMethod.releaseConnection(); } return response; } /** * post請(qǐng)求 * @param url * @param json * @return */ public static String doPost(String url, JSONObject json){ HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod(url); postMethod.addRequestHeader("accept", "*/*"); postMethod.addRequestHeader("connection", "Keep-Alive"); //設(shè)置json格式傳送 postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK"); //必須設(shè)置下面這個(gè)Header postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"); //添加請(qǐng)求參數(shù) postMethod.addParameter("commentId", json.getString("commentId")); String res = ""; try { int code = httpClient.executeMethod(postMethod); if (code == 200){ res = postMethod.getResponseBodyAsString(); System.out.println(res); } } catch (IOException e) { e.printStackTrace(); } return res; } public static void main(String[] args) { System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=telPhone", "GBK")); System.out.println("-----------分割線------------"); System.out.println("-----------分割線------------"); System.out.println("-----------分割線------------"); JSONObject jsonObject = new JSONObject(); jsonObject.put("commentId", "telPhone"); System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject)); } }
總結(jié)
到此這篇關(guān)于java遠(yuǎn)程調(diào)用接口、URL的文章就介紹到這了,更多相關(guān)java遠(yuǎn)程調(diào)用接口URL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HttpClient 在Java項(xiàng)目中的使用詳解
HttpClient作為訪問(wèn)Http服務(wù)的客戶(hù)端訪問(wèn)程序已經(jīng)被廣泛使用,提高了開(kāi)發(fā)效率,也提高了代碼的健壯性。因此熟練掌握HttpClient是必需的,關(guān)于httpclient感興趣的朋友可以參考本篇文章2015-10-10Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Mybatis-plus解決兼容oracle批量插入的示例詳解
Mybatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,提供無(wú)侵入、損耗小的 CRUD 操作,本文給大家介紹了Mybatis-plus解決兼容oracle批量插入,文中通過(guò)大家介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11Mac系統(tǒng)搭建JDK及JMETER過(guò)程解析
這篇文章主要介紹了Mac系統(tǒng)搭建JDK及JMETER過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08使用FeignClient進(jìn)行微服務(wù)交互方式(微服務(wù)接口互相調(diào)用)
這篇文章主要介紹了使用FeignClient進(jìn)行微服務(wù)交互方式(微服務(wù)接口互相調(diào)用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select解析
這篇文章主要介紹了mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java核心編程之文件過(guò)濾類(lèi)FileFilter和FilenameFilter
這篇文章主要為大家詳細(xì)介紹了java文件過(guò)濾類(lèi)FileFilter和FilenameFilter,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08SpringBoot中使用異步調(diào)度程序的高級(jí)方法
本文主要介紹了SpringBoot中使用異步調(diào)度程序的高級(jí)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07