HttpClient遠程介面調用-實名認證

来源:https://www.cnblogs.com/lisingshen/archive/2019/09/22/11569290.html
-Advertisement-
Play Games

1、HttpClient遠程介面調用 1)用戶註冊 註冊按鈕 提交表單時,要 表單 js提交表單 2)載入外部資源文件 app.properties 編輯 RestApiServerInfo.java 3)HTTPClient工具遠程調用介面 導入依賴 發送post請求 工具類 遠程介面返回 封裝對 ...


1、HttpClient遠程介面調用

1)用戶註冊

用戶註冊

註冊按鈕button提交表單時,要return false

form表單

    <!-- action="http://localhost:8082/scw-restapi/member/regist" -->
    <form class="form-signin" role="form" action="${ctp}/member/regist"
        method="post" id="regForm">
    ...
    </form>

js提交表單

    $("#submitBtn").click(function() {

        var loginType = $("select.form-control").val();
        log("註冊類型==============>", loginType)
        
        /* if (loginType == "管理") {
            $("#regForm").submit();
        } else {
            alert("此功能尚未開通");
        } */

        $("#regForm").submit();
        return false
    })

2)載入外部資源文件

app.properties

restapi.server.ip=127.0.0.1
restapi.server.port=8082
restapi.server.apppath=scw-restapi

編輯springmvc.xml

    <!-- 引入外部配置文件 -->
    <context:property-placeholder
        location="classpath:other/app.properties" />

RestApiServerInfo.java

    @Controller
    public class RestApiServerInfo {
    
        // MemberService memberService;
        @Value("${restapi.server.ip}")
        private String restapiserver;
    
        @Value("${restapi.server.port}")
        private String restapiport;
    
        @Value("${restapi.server.apppath}")
        private String appPath;
    
        public String getRestApiURL() {
            System.out.println("http://" + restapiserver + ":" + restapiport);
            return "http://" + restapiserver + ":" + restapiport + "/" + appPath;
        }
    }

3)HTTPClient工具遠程調用介面

導入依賴

    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.3</version>
    </dependency>

發送post請求

    public static String httpPostRequest(String url, Map<String, Object> params)

工具類HttpClientUtil.java

package com.atguigu.project;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**
 * @author Nan 2015-11
 */
public class HttpClientUtil {

    private static PoolingHttpClientConnectionManager cm;
    private static String EMPTY_STR = "";
    private static String UTF_8 = "UTF-8";

    private static void init() {
        if (cm == null) {
            cm = new PoolingHttpClientConnectionManager();
            cm.setMaxTotal(50);// 整個連接池最大連接數
            cm.setDefaultMaxPerRoute(5);// 每路由最大連接數,預設值是2
        }
    }

    /**
     * 通過連接池獲取HttpClient
     * 
     * @return
     */
    private static CloseableHttpClient getHttpClient() {
        init();
        return HttpClients.custom().setConnectionManager(cm).build();
    }

    /**
     * @param url
     * @return
     */
    public static String httpGetRequest(String url) {
        HttpGet httpGet = new HttpGet(url);
        return getResult(httpGet);
    }

    public static String httpGetRequest(String url, Map<String, Object> params) throws URISyntaxException {
        URIBuilder ub = new URIBuilder();
        ub.setPath(url);

        ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
        ub.setParameters(pairs);

        HttpGet httpGet = new HttpGet(ub.build());
        return getResult(httpGet);
    }

    public static String httpGetRequest(String url, Map<String, Object> headers, Map<String, Object> params)
            throws URISyntaxException {
        URIBuilder ub = new URIBuilder();
        ub.setPath(url);

        ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
        ub.setParameters(pairs);

        HttpGet httpGet = new HttpGet(ub.build());
        for (Map.Entry<String, Object> param : headers.entrySet()) {
            httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));
        }
        return getResult(httpGet);
    }

    public static String httpPostRequest(String url) {
        HttpPost httpPost = new HttpPost(url);
        return getResult(httpPost);
    }

    public static String httpPostRequest(String url, Map<String, Object> params) throws UnsupportedEncodingException {
        HttpPost httpPost = new HttpPost(url);
        ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
        httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));
        return getResult(httpPost);
    }

    public static String httpPostRequest(String url, Map<String, Object> headers, Map<String, Object> params)
            throws UnsupportedEncodingException {
        HttpPost httpPost = new HttpPost(url);

        for (Map.Entry<String, Object> param : headers.entrySet()) {
            httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
        }

        ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
        httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));

        return getResult(httpPost);
    }

    private static ArrayList<NameValuePair> covertParams2NVPS(Map<String, Object> params) {
        ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
        for (Map.Entry<String, Object> param : params.entrySet()) {
            pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue())));
        }

        return pairs;
    }

    /**
     * 處理Http請求
     * 
     * @param request
     * @return
     */
    private static String getResult(HttpRequestBase request) {
        // CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpClient httpClient = getHttpClient();
        try {
            CloseableHttpResponse response = httpClient.execute(request);
            // response.getStatusLine().getStatusCode();
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                // long len = entity.getContentLength();// -1 表示長度未知
                String result = EntityUtils.toString(entity);
                response.close();
                // httpClient.close();
                return result;
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }

        return EMPTY_STR;
    }

}

遠程介面返回ScwReturn<T>封裝對象

package com.atguigu.scw.restapi.bean;

import java.util.Map;

public class ScwReturn<T> {

    private int code;// 狀態碼 1:表示成功 0:表示失敗
    private String msg;// 要給的提示信息
    private T content;// 響應的內容;
    private Map<String, Object> ext;// 額外的數據

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }

    public Map<String, Object> getExt() {
        return ext;
    }

    public void setExt(Map<String, Object> ext) {
        this.ext = ext;
    }

    // 兩個快速的成功失敗方法
    public static <T> ScwReturn<T> success(String msg, T content, Map<String, Object> ext) {
        ScwReturn<T> t = new ScwReturn<T>();
        t.setCode(1);
        t.setMsg(msg);
        t.setContent(content);
        t.setExt(ext);
        return t;
    }

    public static <T> ScwReturn<T> fail(String msg, T content, Map<String, Object> ext) {
        ScwReturn<T> t = new ScwReturn<T>();
        t.setCode(0);
        t.setMsg(msg);
        t.setContent(content);
        t.setExt(ext);
        return t;
    }
}


註冊調用遠程介面

發送請求

String response = HttpClientUtil.httpPostRequest(url, params);

遠程介面返回的響應字元串轉java對象

    readValue = new ObjectMapper().readValue(response.getBytes(), new TypeReference<ScwReturn<TMemeber>>() {
        });

@RequestMapping("/regist")
public String regist(TMemeber memeber, Model model) throws Exception {
    // 需要利用http工具去模擬發調用介面的請求
    // http://localhost:8082/scw-restapi/member/regist
    // <httpclient.version>4.5.3</httpclient.version>
    // httpclient使用java代碼來模擬發送請求
    // 能收到api調用後產生的json數據;
    // 1、可以將產生的json逆向成對象ScwReturn<TMemeber>
    // 2、可以直接將json寫給頁面
    System.out.println("memeber===========>" + memeber);
    // 註冊成功以後可以來到一個頁面;

    // 1、應該去發送請求來進行註冊;java代碼發請求
    String url = serverInfo.getRestApiURL() + "/member/regist";
    System.out.println("url===========>" + url);
    // 2、構建請求參數
    Map<String, Object> params = new HashMap<String, Object>();

    params.put("loginacct", memeber.getLoginacct());
    // 密碼是業務邏輯加密的,我們不用管
    params.put("userpswd", memeber.getUserpswd());
    params.put("email", memeber.getEmail());

    // 響應內容;
    String response = HttpClientUtil.httpPostRequest(url, params);

    // 封裝響應為對象
    ScwReturn<TMemeber> readValue = null;

    readValue = new ObjectMapper().readValue(response.getBytes(), new TypeReference<ScwReturn<TMemeber>>() {
    });

    // 判斷,註冊成功!來到登陸頁面
    if (readValue.getCode() == 1) {
        return "redirect:/login.jsp";
    } else {
        // 註冊失敗!來到註冊頁面進行回顯
        model.addAttribute("msg", "用戶名和郵箱已經被註冊了!");
        return "forward:/reg.jsp";
    }
}

遠程介面註冊方法

控制層

    /**
     * ScwReturn<List<TMemeber>>:泛型是content內容的對象的類型
     * 
     * @Description (TODO這裡用一句話描述這個方法的作用)
     * @param memeber
     * @return
     */
    @RequestMapping("/regist")
    public ScwReturn<TMemeber> regist(TMemeber memeber) {

        // 創建一個空的對象
        TMemeber regist = new TMemeber();
        Map<String, Object> hashMap = new HashMap<>();
        try {
            regist = memberService.regist(memeber);
        } catch (Exception e) {
            // 判斷異常類型來放錯誤
            // e.printStackTrace();
            hashMap.put("error", "觸犯唯一約束,請保證用戶名和郵箱唯一");
        }
        regist.setUserpswd("");
        if (regist.getId() != null) {
            return ScwReturn.success("用戶註冊成功!", regist, null);
        } else {
            return ScwReturn.fail("用戶註冊失敗!", null, hashMap);
        }
    }

業務層

帶條件插入

    int i = memeberMapper.insertSelective(tMemeber);

    @Override
    public TMemeber regist(TMemeber tMemeber) {
        // TODO Auto-generated method stub
        String digest = MD5Util.digest(tMemeber.getUserpswd());
        // 加密密碼保存
        tMemeber.setUserpswd(digest);
        // 初始化用戶名和賬號
        tMemeber.setUsername(tMemeber.getLoginacct());
        // 實名認證狀態 0:未實名認證 1::實名認證
        tMemeber.setAuthstatus("0");
        // 真實姓名;實名認證是保存的
        tMemeber.setRealname("未實名");
        // 0:普通會員 1:月費會員 2:年費會員 3:
        tMemeber.setUsertype("0");
        // 身份證號,賬戶類型;(實名認證是做的)
        // 賬戶類型:直接保存賬戶的全名

        int i = memeberMapper.insertSelective(tMemeber);

        // 剛纔就是按照這個對象給資料庫插入值,希望獲取到資料庫分配的自增主鍵
        return tMemeber;
    }

2、實名認證文件上傳

1)上傳用戶資質證件

導入依賴

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>

編輯springmvc.xml文件

    <!-- 1、文件上傳需要一個文件上傳解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>

前臺ajax提交

帶有文件表單,一次提交所有項

var fd = new FormData($("#certForm")[0])

帶有文件表單,提交部分內容

//使用formData(js對象來包裝form表單)
var fd = new FormData();
log($("#ad_name_input").val())
log($("#ad_file_input")[0].files[0])
fd.append("name", $("#ad_name_input").val());
fd.append("ad", $("#ad_file_input")[0].files[0])

processData(預設: true)

預設情況下,通過data選項傳遞進來的數據,如果是一個對象(技術上講只要不是字元串),都會處理轉化成一個查詢字元串,以配合預設內容類型 "application/x-www-form-urlencoded"。

contentType

不使用預設的內容類型;(預設: "application/x-www-form-urlencoded") 發送信息至伺服器時內容編碼類型。

    //這是一個資質文件上傳的頁面
    //發送文件上傳資質文件請求;
    var fd = new FormData($("#certForm")[0]);
    $.ajax({
        url:"http://localhost:8082/scw-restapi/auth/upload",
        data:fd,
        type:"post",
        contentType:false,
        dataType:"json",
        processData:false,
        success:function(result){
            //來到郵箱填寫頁面
            location.href="${ctp}/auth/apply-2.html"
        },
        error:function(e){
            layer.msg("上傳失敗:"+e);
        }
    });

控制層

    //文件上傳
    private String uploadfile(String webPath,MultipartFile file,HttpSession session){
        ServletContext context = session.getServletContext();
        String realPath = context.getRealPath(webPath);
        String name = UUID.randomUUID().toString().replace("-", "").substring(0, 10) +"_file_"+ file.getOriginalFilename();
        try {
            //webPath不存在的情況下必須創建
            File file2 = new File(realPath);
            if(!file2.exists()){
                //創建目錄
                file2.mkdirs();
            }
            
            file.transferTo(new File(realPath+"/"+name));
            //返回這個圖片在伺服器下的路徑
            return webPath+"/"+name;
        }catch (Exception e) {
            return null;
        }
    }
    
    @RequestMapping("/upload")
    public ScwReturn<Object> upload(HttpSession session,
            @RequestParam("file")MultipartFile[] file,
            @RequestParam("certid")Integer[] certid,@RequestParam("memberid")Integer memberid){
        
        try {
            System.out.println("資質的id"+certid);
            List<TMemberCert> certsList= new ArrayList<TMemberCert>();
            for (int i=0;i<certid.length;i++) {
                TMemberCert cert = new TMemberCert();
                MultipartFile multipartFile = file[i];
                String uploadfile = uploadfile("/certsimg", multipartFile, session);
                cert.setCertid(certid[i]);
                cert.setMemberid(memberid);
                cert.setIconpath(uploadfile);
                certsList.add(cert);
            }
            //調用業務邏輯進行保存;/刪除原有資質,保存新的資質
            certService.insertCerts(certsList);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println(e);
            return ScwReturn.fail("資質保存失敗!", null, null);
        }
        
        return ScwReturn.success("保存成功!", null, null);
    }

2)批量插入用戶資質證件描述信息

業務層

CertService.java

    public void insertCerts(List<TMemberCert> certsList);

CertServiceImpl.java

    @Override
    public void insertCerts(List<TMemberCert> certsList) {
        // TODO Auto-generated method stub
        TMemberCertExample example = new TMemberCertExample();
        Criteria criteria = example.createCriteria();
        criteria.andMemberidEqualTo(certsList.get(0).getMemberid());
        //先刪除
        memberCertMapper.deleteByExample(example);
        //後保存
        certMapper.insertBatch(certsList);
    }

dao層

TCertMapper.java

    void insertBatch(@Param("certs")List<TMemberCert> certsList);

TCertMapper.xml

  <!-- void insertBatch(@Param("certs")List<TMemberCert> certsList); -->
  <insert id="insertBatch">
        INSERT INTO t_member_cert(memberid,certid,iconpath) 
        VALUES
        <foreach collection="certs" item="c" separator=",">
            (#{c.memberid},#{c.certid},#{c.iconpath})
        </foreach>
  </insert>


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • R語言構建蛋白質網路並實現GN演算法 1.蛋白質網路的構建 我們使用與人類HIV相關的蛋白質互作數據hunam HIV PPI.csv來構建這個蛋白質互作網路。 在R中,我們可以從存儲在R環境外部的文件讀取數據。還可以將數據寫入由操作系統存儲和訪問的文件。 R可以讀取和寫入各種文件格式,如:csv,e ...
  • 面試題 如何保證消息的順序性? 面試官心理分析 其實這個也是用 MQ 的時候必問的話題,第一看看你了不瞭解順序這個事兒?第二看看你有沒有辦法保證消息是有順序的?這是生產系統中常見的問題。 面試題剖析 我舉個例子,我們以前做過一個 mysql 同步的系統,壓力還是非常大的,日同步數據要達到上億,就是說 ...
  • 發現模塊和集群的形成 目標 發現節點 Master選舉 組成集群,在Master信息發生變化時及時更新。 故障檢測 細分為幾個子模塊 Discovery發現模塊 Discover是在集群Master節點未知時,互相發現對方的過程,例如新節點的加入或是先前的主節點宕機,如果一個節點不滿足Master資 ...
  • JConsole(可視化工具) 運行 JConsole記憶體監控 測試代碼 這裡看到我們有倆個線程。 JPS(JVM Process status) JPS是使用的頻率最高的工具,和linux下的ps命令差不多(把J去掉就是一個ps)。 因為我這裡開啟了一個eclipse,所以運行結果如下所示: 如果 ...
  • 1. 概述 在本教程中,我們將探討如何使用兩種不同的策略改進客戶端重試:指數後退和抖動。 2. 重試 在分散式系統中,多個組件之間的網路通信隨時可能發生故障。 客戶端應用程式通過實現重試來處理這些失敗。 設想我們有一個調用遠程服務的客戶端應用程式—— PingPongService 。 如果 Pin ...
  • 0922自我總結 DJango錯誤日誌生成 setting.py設置 exception.py(拋錯設置) logging.py ...
  • 工作了兩個月了體會到了很多之前做外包小項目沒有的東西,不得不說大廠的還是有自己一套的完善的體制,不會像B站那樣泄露自己整個後臺的源碼這種事情發生。 電腦辦公 比如說在使用電腦辦公這方面,剛入職那天每個人都會領一臺電腦(MAC和Windows都有看工作需要),每個人領的電腦上都裝有 度管家 ,度管家是 ...
  • 1、ssh免密登錄 ssh ip地址 免密登錄配置 生成公鑰和私鑰 將公鑰拷貝到要免密登錄的目標機器上 .ssh文件夾下(~/.ssh)的文件功能解釋 (1)known_hosts :記錄ssh訪問過電腦的公鑰(public key) (2)id_rsa :生成的私鑰 (3)id_rsa.pub ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...