httpclient如何處理302重定向

在使用httpclient作接口測試的時候,遇到了一個重定向的接口,因爲框架緣由致使的必需得重定向到另一個域名的接口完成功能。在以前未遇到這個的狀況,通過修改請求方法解決了這個問題。大體思路是:若是發現是HTTP code是302,就會去header數組裏面找location的字段,把字段的結果放到響應體裏面,個人響應體是json格式的。java

  • 中間還須要修改一部分的httpclient鏈接池和requestconfig的配置。

代碼以下:編程

/**
     * 獲取響應實體
     * <p>會自動設置cookie,可是須要各個項目再自行實現cookie管理</p>
     * <p>該方法只會處理文本信息,對於文件處理能夠調用兩個過時的方法解決</p>
     *
     * @param request 請求對象
     * @return 返回json類型的對象
     */
    public static JSONObject getHttpResponse(HttpRequestBase request) {
        if (!isRightRequest(request)) return new JSONObject();
        beforeRequest(request);
        JSONObject res = new JSONObject();
        RequestInfo requestInfo = new RequestInfo(request);
        if (HEADER_KEY) output("===========request header===========", Arrays.asList(request.getAllHeaders()));
        long start = Time.getTimeStamp();
        try (CloseableHttpResponse response = ClientManage.httpsClient.execute(request)) {
            long end = Time.getTimeStamp();
            long elapsed_time = end - start;
            if (HEADER_KEY) output("===========response header===========", Arrays.asList(response.getAllHeaders()));
            int status = getStatus(response, res);
            JSONObject setCookies = afterResponse(response);
            String content = getContent(response);
            int data_size = content.length();
            res.putAll(getJsonResponse(content, setCookies));
            int code = iBase == null ? -2 : iBase.checkCode(res, requestInfo);
//            if (!iBase.isRight(res))
//                new AlertOver("響應狀態碼錯誤:" + status, "狀態碼錯誤:" + status, requestInfo.getUrl(), requestInfo).sendSystemMessage();
            MySqlTest.saveApiTestDate(requestInfo, data_size, elapsed_time, status, getMark(), code, LOCAL_IP, COMPUTER_USER_NAME);
        } catch (Exception e) {
            logger.warn("獲取請求相應失敗!", e);
            if (!SysInit.isBlack(requestInfo.getHost()))
                new AlertOver("接口請求失敗", requestInfo.toString(), requestInfo.getUrl(), requestInfo).sendSystemMessage();
        } finally {
            HEADER_KEY = false;
            if (!SysInit.isBlack(requestInfo.getHost())) {
                if (requests.size() > 9) requests.removeFirst();
                boolean add = requests.add(request);
            }
        }
        return res;
    }
    
    
        /**
     * 獲取響應狀態,處理重定向的url
     *
     * @param response
     * @param res
     * @return
     */
    public static int getStatus(CloseableHttpResponse response, JSONObject res) {
        int status = response.getStatusLine().getStatusCode();
        if (status != HttpStatus.SC_OK) logger.warn("響應狀態碼錯誤:{}", status);
        if (status == HttpStatus.SC_MOVED_TEMPORARILY)
            res.put("location", response.getFirstHeader("Location").getValue());
        return status;
    }

下面是配置:json

/**
     * 獲取請求超時控制器
     * <p>
     * cookieSpec:即cookie策略。參數爲cookiespecs的一些字段。做用:
     * 一、若是網站header中有set-cookie字段時,採用默認方式可能會被cookie reject,沒法寫入cookie。將此屬性設置成CookieSpecs.STANDARD_STRICT可避免此狀況。
     * 二、若是要想忽略cookie訪問,則將此屬性設置成CookieSpecs.IGNORE_COOKIES。
     * </p>
     *
     * @return
     */
    private static RequestConfig getRequestConfig() {
        return RequestConfig.custom().setConnectionRequestTimeout(HttpClientConstant.CONNECT_REQUEST_TIMEOUT).setConnectTimeout(HttpClientConstant.CONNECT_TIMEOUT).setSocketTimeout(HttpClientConstant.SOCKET_TIMEOUT).setCookieSpec(CookieSpecs.IGNORE_COOKIES).setRedirectsEnabled(false).build();
    }

requestconfig既能夠在建立httpclient鏈接池的時候設置,也能夠在對HTTPrequestbase進行設置,這裏我採起了第一種方式。數組

在學習selenium2java的時候,在寫收貨地址相關用例的時候碰到了下拉框,恰好練習了一下select的使用,如今分享,供你們參考。cookie

//刪除添加收貨地址
	public static void deleteAndAddUserAdress(WebDriver driver) throws InterruptedException {
		clickUser(driver);
		findElementByTextAndClick(driver, "我的信息");
		findElementByTextAndClick(driver, "收貨地址");
		clickDeleteAdress(driver);
		sleep(0);
		clickSure(driver);
		AddAddress(driver);
		String name = getTextByXpath(driver, ".//*[@id='main']/div[2]/div/div/div[1]/p[1]");
		assertTrue("添加收穫地址失敗!", name.equals("收貨人:測試收貨人"));
	}

下面是具體的添加收貨地址的方法:框架

//添加收貨地址
	public static void AddAdress(WebDriver driver) {
		findElementByIdAndClick(driver, "add-address-btn");//點擊添加地址
		findElementByXpathAndClearSendkeys(driver, ".//*[@id='LAY_layuipro1a']/div/div[1]/table/tbody/tr[1]/td[2]/div/input", "測試收貨人");//添加收貨人
		findElementByXpathAndClearSendkeys(driver, ".//*[@id='LAY_layuipro1a']/div/div[1]/table/tbody/tr[2]/td[2]/div/input", "13120454218");//輸入手機號
		//選擇省市縣,以及詳細地址
		Select province = new Select(findElementByid(driver, "province-select"));
		province.selectByIndex(1);
		Select city = new Select(findElementByid(driver, "city-select"));
		city.selectByIndex(1);			
		Select area = new Select(findElementByid(driver, "area-select"));
		area.selectByIndex(1);
		findElementByClassnameAndClearSendkeys(driver, "textarea", "我是測試地址。");
		clickSave(driver);
	}

往期文章精選

  1. java一行代碼打印心形
  2. Linux性能監控軟件netdata中文漢化版
  3. 接口測試代碼覆蓋率(jacoco)方案分享
  4. 性能測試框架
  5. 如何在Linux命令行界面愉快進行性能測試
  6. 圖解HTTP腦圖
  7. 寫給全部人的編程思惟
  8. 如何測試機率型業務接口
  9. httpclient處理多用戶同時在線
  10. 成爲傑出Java開發人員的10個步驟
  11. 將swagger文檔自動變成測試代碼
  12. 五行代碼構建靜態博客
  13. httpclient如何處理302重定向

公衆號地圖 ☢️ 一塊兒來~FunTester

相關文章
相關標籤/搜索