最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何實(shí)現(xiàn)調(diào)用外部Api

 更新時(shí)間:2024年05月13日 10:28:01   作者:韓一聰  
這篇文章主要介紹了Java如何實(shí)現(xiàn)調(diào)用外部Api問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java調(diào)用外部Api

在日常開(kāi)發(fā)的時(shí)候,經(jīng)常會(huì)遇到需要調(diào)用別人的接口的場(chǎng)景。但是每次需要的時(shí)候,都需要百度,很麻煩,所以這里總結(jié)一下,經(jīng)常調(diào)用的方法。

1.含有文件的post請(qǐng)求

	public static String requestOCRForHttp(String url, Map<String, String> requestParams, String filePathAndName)
			throws Exception {
		String result = null;
		CloseableHttpClient httpClient = HttpClients.createDefault();
		/** HttpPost */
		HttpPost httpPost = new HttpPost(url);
		MultipartEntity reqEntity = new MultipartEntity(); // 建立多文件實(shí)例
		FileBody filebody = new FileBody(new File(filePathAndName));
		reqEntity.addPart("pic", filebody);// upload為請(qǐng)求后臺(tái)的File upload;
		for (String key : requestParams.keySet()) {
			String value = requestParams.get(key);
			reqEntity.addPart(key, new StringBody(value, Charset.forName("utf-8")));
		}
		httpPost.setEntity(reqEntity); // 設(shè)置實(shí)體
		/** HttpResponse */
		CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
		try {
			HttpEntity httpEntity = httpResponse.getEntity();
			result = EntityUtils.toString(httpEntity, "utf-8");
			EntityUtils.consume(httpEntity);
		} finally {
			try {
				if (httpResponse != null) {
					httpResponse.close();
				}
			} catch (IOException e) {
				logger.info("## release resouce error ##" + e);
			}
		}
		return result;
	}

2.單純的Json

	public static String sendHttpPost(String url, String JSONBody) throws Exception {
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(url);
		httpPost.addHeader("Content-Type", "application/json");
		httpPost.setEntity(new StringEntity(JSONBody));
		CloseableHttpResponse response = httpClient.execute(httpPost);
//		System.out.println(response.getStatusLine().getStatusCode() + "\n");
		HttpEntity entity = response.getEntity();
		String responseContent = EntityUtils.toString(entity, "UTF-8"); 
//		System.out.println(responseContent);
		response.close();
		httpClient.close();
		return responseContent;
	}

3.String參數(shù)

	public static String requestOCRForHttp(String url, Map<String, String> requestParams) throws Exception {
		String result = null;
		CloseableHttpClient httpClient = HttpClients.createDefault();
		/** HttpPost */
		HttpPost httpPost = new HttpPost(url);
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		Iterator<Entry<String, String>> it = requestParams.entrySet().iterator();
//		System.out.println(params.toString());
		while (it.hasNext()) {
			Entry<String, String> en = it.next();
			String key = en.getKey();
			String value = en.getValue();
			if (value != null) {
				params.add(new BasicNameValuePair(key, value));
			}
		}
		httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
		/** HttpResponse */
		CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
		try {
			HttpEntity httpEntity = httpResponse.getEntity();
			result = EntityUtils.toString(httpEntity, "utf-8");
			EntityUtils.consume(httpEntity);
		} finally {
			try {
				if (httpResponse != null) {
					httpResponse.close();
				}
			} catch (IOException e) {
				logger.info("## release resouce error ##" + e);
			}
		}
		return result;
	}

Java對(duì)接外部API這個(gè)問(wèn)題

有一個(gè)小學(xué)妹來(lái)問(wèn)我可以將我其他項(xiàng)目的api接入到我現(xiàn)在的項(xiàng)目中嗎?我回答“可以”!

需求提出

那么拿到一個(gè)需求首先話(huà)不多說(shuō)先分析這個(gè)需求的整體思路!需求上面大概有介紹,這里我更深入化的說(shuō)明一下。

對(duì)接外部api接口就是說(shuō)我在A(yíng)項(xiàng)目寫(xiě)了一個(gè)接口時(shí)我的B項(xiàng)目需要到A這個(gè)接口的數(shù)據(jù),那么在A(yíng)項(xiàng)目上線(xiàn)的基礎(chǔ)上使用B項(xiàng)目去調(diào)用A項(xiàng)目的這個(gè)所需的接口,如下圖:

其實(shí)對(duì)接外部api就是這么一個(gè)過(guò)程,當(dāng)然我們拿到外部數(shù)據(jù)后面的操作都是由自己去自由發(fā)揮了,比如將讀取到的數(shù)據(jù)來(lái)顯示在這個(gè)項(xiàng)目中去給前端顯示?;蛘叽嫒霐?shù)據(jù)庫(kù)等等。

解決思路

上面已經(jīng)理解了調(diào)用的的思路,有了思路就好解決,現(xiàn)在很多的外部api接口可以給開(kāi)發(fā)時(shí)帶來(lái)便利,當(dāng)然,調(diào)用的方式可能也會(huì)有稍些不同,比如手機(jī)號(hào)查詢(xún)歸屬地、郵箱等等。

像這種的一般都是有官方文檔可以給我們,很方便。

但是我們?nèi)フ{(diào)用自己的api又不是在一個(gè)項(xiàng)目中的那就要想想怎么實(shí)現(xiàn)了。

話(huà)不多說(shuō)我就拿我之前寫(xiě)了一個(gè)DEMO中的數(shù)據(jù)吧,剛好項(xiàng)目還在線(xiàn)上。

編碼

package edu.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.HttpMethod;
import edu.entity.EventVo;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author Fujii
 * @Date 2021-10-11 23:12
 * @Version SpringBoot 2.2.2
 * @projectName 調(diào)用外部api接口
 */
@RestController
public class BackEndApiDemo {

    @GetMapping("apiList")
    public Map<String,Object> getByApiList(){
        //這里先創(chuàng)建一個(gè)map用于返回api格式
        Map<String,Object> mapList = new HashMap<>();
        //1.我們是要去調(diào)用外部api,那么肯定要有一個(gè)外部api的地址,這里我是拿我的DEMO作為數(shù)據(jù)傳輸
        String apiURL = "這里直接放入你的api接口即可,我的api就不展示了,請(qǐng)諒解!";
        //2.這里有幾種方式,你們?nèi)ピ嚵诉^(guò)后會(huì)發(fā)現(xiàn)不只有GET,這里因?yàn)槲覀兪侨カ@取數(shù)據(jù),所以是用GET
        HttpMethod method = HttpMethod.GET;
        //用于接口返回的JSONObject()
        LinkedMultiValueMap map = new LinkedMultiValueMap();
        //json接收數(shù)據(jù)
        JSONObject  urlMethod = client(apiURL,method,map);
        JSONObject jsonObject = JSONObject.parseObject(urlMethod.toJSONString());
        JSONArray object = JSONObject.parseArray(jsonObject.get("data").toString());
        if (jsonObject!=null){
            List<EventVo> list = JSONArray.parseArray(object.toJSONString(), EventVo.class);
            mapList.put("list",list);
            mapList.put("code",200);
            mapList.put("msg", "獲取成功!");

        }else{
            mapList.put("code",500);
            mapList.put("msg", "獲取失敗!");
            return mapList;
        }
        return mapList;
    }
    
    //注意:因?yàn)槭菧y(cè)試,所有我所有內(nèi)容全部寫(xiě)在一個(gè)文件內(nèi)方便展示清晰,正規(guī)寫(xiě)法應(yīng)寫(xiě)在服務(wù)層
    private JSONObject client(String url, HttpMethod method, LinkedMultiValueMap params) {
        RestTemplate template = new RestTemplate();
        ResponseEntity<JSONObject> response = template.getForEntity(url, JSONObject.class);
        return response.getBody();
    }
}

測(cè)試

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)五子棋游戲(控制臺(tái)版)

    Java實(shí)現(xiàn)五子棋游戲(控制臺(tái)版)

    這篇文章主要為大家詳細(xì)介紹了Java控制臺(tái)版實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • rocketmq client 日志的問(wèn)題處理方式

    rocketmq client 日志的問(wèn)題處理方式

    這篇文章主要介紹了rocketmq client 日志的問(wèn)題處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線(xiàn)程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • Java使用Filter實(shí)現(xiàn)登錄驗(yàn)證

    Java使用Filter實(shí)現(xiàn)登錄驗(yàn)證

    本文主要介紹了Java使用Filter實(shí)現(xiàn)登錄驗(yàn)證,Filter類(lèi)似于門(mén)衛(wèi),你在進(jìn)入之前門(mén)衛(wèi)需要盤(pán)查你,身份合法進(jìn)入,身份不合法攔截,感興趣的可以了解一下
    2023-11-11
  • Java實(shí)現(xiàn)遞歸讀取文件夾下的所有文件

    Java實(shí)現(xiàn)遞歸讀取文件夾下的所有文件

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)遞歸讀取文件夾下的所有文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Java中字符串的一些常見(jiàn)方法分享

    Java中字符串的一些常見(jiàn)方法分享

    這篇文章主要介紹了Java中字符串的一些常見(jiàn)方法,需要的朋友可以參考下
    2014-02-02
  • Reactor定制一個(gè)生產(chǎn)的WebClient實(shí)現(xiàn)示例

    Reactor定制一個(gè)生產(chǎn)的WebClient實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Reactor定制一個(gè)生產(chǎn)的WebClient實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringMVC超詳細(xì)介紹自定義攔截器

    SpringMVC超詳細(xì)介紹自定義攔截器

    Spring?MVC?的攔截器(Interceptor)與?Java?Servlet?的過(guò)濾器(Filter)類(lèi)似,它主要用于攔截用戶(hù)的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶(hù)是否登錄等功能上。本文將代碼演示和文字描述詳解攔截器的原理與使用
    2022-06-06
  • java中 IO 常用IO操作類(lèi)繼承結(jié)構(gòu)分析

    java中 IO 常用IO操作類(lèi)繼承結(jié)構(gòu)分析

    本篇文章小編為大家介紹,java中 IO 常用IO操作類(lèi)繼承結(jié)構(gòu)分析。需要的朋友參考下
    2013-04-04
  • Mybatis中OGNL表達(dá)式的具體使用

    Mybatis中OGNL表達(dá)式的具體使用

    OGNL是一種簡(jiǎn)潔、靈活的表達(dá)式語(yǔ)言,本文就來(lái)介紹一下OGNL的概念以及在Mybatis中的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12

最新評(píng)論

赤峰市| 乌鲁木齐市| 综艺| 小金县| 万年县| 增城市| 彭水| 开原市| 临安市| 惠东县| 偃师市| 东山县| 锦州市| 秀山| 铜梁县| 马公市| 碌曲县| 大竹县| 枝江市| 伊春市| 莎车县| 监利县| 乌兰浩特市| 五大连池市| 东至县| 东乌珠穆沁旗| 海盐县| 武乡县| 蓬莱市| 张家川| 长丰县| 咸阳市| 安义县| 广平县| 松溪县| 恩施市| 宣威市| 建昌县| 石台县| 钦州市| 雷州市|