Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美高清360,99久久久国产精品免费播放器 ,一级黄色毛片播放

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Jmeter通過BeanShell PostProcessor處理返回的html內(nèi)容

          用背景

          之前在LS公司時,產(chǎn)品有多端,要走完一個完整的業(yè)務(wù)流程,手動測試造數(shù)據(jù),總時很麻煩;

          但是UI測試又不是那么的穩(wěn)定,維護(hù)起來效果也不太好;

          所以呢,通過jmeter接口實現(xiàn)業(yè)務(wù)流程的自動化了,但是CRM并沒有前后端分離,那怎么通過接口來實現(xiàn)呢,當(dāng)時的處理方法,就是通過jmeter自身的代理,抓包后,處理下相應(yīng)參數(shù)來銜接周邊系統(tǒng);

          當(dāng)然,因為要跨端,有些接口headers里面的Content-Type是不一樣的,這樣的話,就要用多線程了,而且前后順序也是有規(guī)定的。

          主題分享

          今天要分享的就是,抓包的接口返回的結(jié)果是html時,怎么來截取自己想要的內(nèi)容

          通過抓包的方式,抓過來的接口,有些返回結(jié)果是html的;一般簡單的,可以用jmeter自帶的正則表達(dá)式匹配出來;但是有些復(fù)雜的,甚至要同時取到返回結(jié)果的多個值時,貌似就有點力不從心了。

          還好jmeter提供了可以編寫java代碼的beanshell,可以通過后置處理器(BeanShell PostProcessor)來處理,當(dāng)時用到的代碼如下:

          markdown中寫下你的文章,并使用Python將它們轉(zhuǎn)換成HTML-作者Florian Dahlitz,于2020年5月18日(15分鐘)

          介紹

          幾個月前,我想開通自己的博客,而不是使用像Medium這樣的網(wǎng)站。這是一個非常基礎(chǔ)的博客,所有的文章都是HTML形式的。然而,有一天,我突然產(chǎn)生了自己編寫Markdown到HTML生成器的想法,最終這將允許我用markdown來編寫文章。此外,為它添加諸如估計閱讀時間之類的擴(kuò)展特性會更容易。長話短說,我實現(xiàn)了自己的markdown到HTML生成器,我真的很喜歡它!

          在本系列文章中,我想向您展示如何構(gòu)建自己的markdown到HTML生成器。該系列由三部分組成:

          • 第一部分(本文)介紹了整個管線的實現(xiàn)。

          • 第二部分通過一個模塊擴(kuò)展了實現(xiàn)的管線,該模塊用于計算給定文章的預(yù)計閱讀時間。

          • 第三部分演示如何使用管線生成自己的RSS摘要。

          這三部分中使用的代碼都可以在GitHub上找到。

          備注:我的文章中markdown到HTML生成器的想法基于Anthony Shaw文章中的實現(xiàn)。

          項目構(gòu)建

          為了遵循本文的內(nèi)容,您需要安裝幾個軟件包。我們把它們放進(jìn)requirements.txt文件。

          Markdown是一個包,它允許您將markdown代碼轉(zhuǎn)換為HTML。之后我們用Flask產(chǎn)生靜態(tài)文件。

          但在安裝之前,請創(chuàng)建一個虛擬環(huán)境,以避免Python安裝出現(xiàn)問題:

          激活后,您可以使用pip安裝requirements.txt中的依賴。

          很好!讓我們創(chuàng)建幾個目錄來更好地組織代碼。首先,我們創(chuàng)建一個app目錄。此目錄包含我們提供博客服務(wù)的Flask應(yīng)用程序。所有后續(xù)目錄都將在app目錄內(nèi)創(chuàng)建。其次,我們創(chuàng)建一個名為posts的目錄。此目錄包含要轉(zhuǎn)換為HTML文件的markdown文件。接下來,我們創(chuàng)建一個templates目錄,其中包含稍后使用Flask展示的模板。在templates目錄中,我們再創(chuàng)建兩個目錄:

          posts包含生成的HTML文件,這些文件與應(yīng)用程序根目錄中posts目錄中的文件相對應(yīng)。

          shared包含在多個文件中使用的HTML文件。

          此外,我們還創(chuàng)建了一個名為services的目錄。該目錄將包含我們在Flask應(yīng)用程序中使用的模塊,或者為它生成某些東西。最后,創(chuàng)建一個名為static的目錄帶有兩個子目錄images和css。自定義CSS文件和文章的縮略圖將存儲在此處。

          您的最終項目結(jié)構(gòu)應(yīng)如下所示:

          令人驚嘆!我們完成了一般的項目設(shè)置。我們來看看Flask的設(shè)置。

          Flask設(shè)置

          路由

          我們在上一節(jié)安裝了Flask。但是,我們?nèi)匀恍枰粋€Python文件來定義用戶可以訪問的端點。在app目錄中創(chuàng)建main.py并將以下內(nèi)容復(fù)制到其中。

          該文件定義了一個具有兩個端點的基礎(chǔ)版Flask應(yīng)用程序。用戶可以使用/route訪問第一個端點返回索引頁,其中列出了所有文章。

          第二個端點是更通用的端點。它接受post的名稱并返回相應(yīng)的HTML文件。

          接下來,我們通過向app目錄中添加一個__init__.py,將其轉(zhuǎn)換為一個Python包。此文件為空。如果您使用UNIX計算機(jī),則可以從項目的根目錄運(yùn)行以下命令:

          模板

          現(xiàn)在,我們創(chuàng)建兩個模板文件index.html以及l(fā)ayout.html,都存儲在templates/shared目錄中。這個layout.html模板將用于單個博客條目,而index.html模板用于生成索引頁,從中我們可以訪問每個帖子。讓我們從index.html模板開始。

          它是一個基本的HTML文件,其中有兩個元標(biāo)記、一個標(biāo)題和兩個樣式表。注意,我們使用一個遠(yuǎn)程樣式表和一個本地樣式表。遠(yuǎn)程樣式表用于啟用Bootstrap[1]類。第二個是自定義樣式。我們晚點再定義它們。

          HTML文件的主體包含一個容器,其中包含Jinja2[2]邏輯,用于為每個post生成Bootstrap卡片[3]。您是否注意到我們不直接基于變量名訪問這些值,而是需要將[0]添加到其中?這是因為文章中解析的元數(shù)據(jù)是列表。實際上,每個元數(shù)據(jù)元素都是由單一元素組成的列表。我們稍后再看。到目前為止,還不錯。讓我們看看layout.html模板。

          如你所見,它比前一個短一點,簡單一點。文件頭與index.html文件很相似,除了我們有不同的標(biāo)題。當(dāng)然,我們可以共用一個模板,但是我不想讓事情變得更復(fù)雜。

          body中的容器僅定義一個h1標(biāo)記。然后,我們提供給模板的內(nèi)容被插入并呈現(xiàn)。

          樣式

          正如上一節(jié)所承諾的,我們將查看自定義CSS文件style.css. 我們在static/css中找到該文件,并根據(jù)需要自定義頁面。下面是我們將用于基礎(chǔ)示例的內(nèi)容:

          我不喜歡Bootstrap中blockquotes的默認(rèn)外觀,所以我們在左側(cè)添加了一點間距和邊框。此外,blockquote段落底部的頁邊空白將被刪除。不刪除的話看起來很不自然。

          最后但并非最不重要的是,左右兩邊的填充被刪除。由于兩邊都有額外的填充,縮略圖沒有正確對齊,所以在這里刪除它們。

          到現(xiàn)在為止,一直都還不錯。我們完成了關(guān)于Flask的所有工作。讓我們開始寫一些帖子吧!

          寫文章

          正如標(biāo)題所承諾的,你可以用markdown寫文章-是的!在寫文章的時候,除了保證正確的markdown格式外,沒有其他需要注意的事情。

          在完成本文之后,我們需要在文章中添加一些元數(shù)據(jù)。此元數(shù)據(jù)添加在文章之前,并由三個破折號分隔開來---。下面是一個示例文章(post1.md)的摘錄:

          注意:您可以在GitHub庫的app/posts/post1.md中找到完整的示例文章。

          在我們的例子中,元數(shù)據(jù)由標(biāo)題、副標(biāo)題、類別、發(fā)布日期和index.html中卡片對應(yīng)縮略圖的路徑組成.

          我們在HTML文件中使用了元數(shù)據(jù),你還記得嗎?元數(shù)據(jù)規(guī)范必須是有效的YAML。示例形式是鍵后面跟著一個冒號和值。最后,冒號后面的值是列表中的第一個也是唯一的元素。這就是我們通過模板中的索引運(yùn)算符訪問這些值的原因。

          假設(shè)我們寫完了文章。在我們可以開始轉(zhuǎn)換之前,還有一件事要做:我們需要為我們的帖子生成縮略圖!為了讓事情更簡單,只需從你的電腦或網(wǎng)絡(luò)上隨機(jī)選取一張圖片,命名它為placeholder.jpg并把它放到static/images目錄中。GitHub存儲庫中兩篇文章的元數(shù)據(jù)包含一個代表圖像的鍵值對,值是placeholder.jpg。

          注意:在GitHub存儲庫中,您可以找到我提到的兩篇示例文章。

          markdown到HTML轉(zhuǎn)換器

          最后,我們可以開始實現(xiàn)markdown to HTML轉(zhuǎn)換器。因此,我們使用我們在開始時安裝的第三方包Markdown。我們先創(chuàng)建一個新模塊,轉(zhuǎn)換服務(wù)將在其中運(yùn)行。因此,我們在service目錄中創(chuàng)建了converter.py。我們一步一步看完整個腳本。您可以在GitHub存儲庫中一次查看整個腳本。

          首先,我們導(dǎo)入所需的所有內(nèi)容并創(chuàng)建幾個常量:

          ROOT指向我們項目的根。因此,它是包含app的目錄。

          POSTS_DIR是以markdown編寫的文章的路徑。

          TEMPLATE_DIR分別指向?qū)?yīng)的templates目錄。

          BLOG_TEMPLATE_文件存儲layout.html的路徑。

          INDEX_TEMPLATE_FILE是index.html

          BASE_URL是我們項目的默認(rèn)地址,例如。https://florian-dahlitz.de.默認(rèn)值(如果不是通過環(huán)境變量DOMAIN提供的話)是http://0.0.0.0:5000。

          接下來,我們創(chuàng)建一個名為generate_entries的新函數(shù)。這是我們定義的唯一一個轉(zhuǎn)換文章的函數(shù)。

          在函數(shù)中,我們首先獲取POSTS_DIR目錄中所有markdown文件的路徑。pathlib的awesome glob函數(shù)幫助我們實現(xiàn)它。

          此外,我們定義了Markdown包需要使用的擴(kuò)展。默認(rèn)情況下,本文中使用的所有擴(kuò)展都隨它的安裝一起提供。

          注意:您可以在文檔[4]中找到有關(guān)擴(kuò)展的更多信息。

          此外,我們實例化了一個新的文件加載程序,并創(chuàng)建了一個在轉(zhuǎn)換項目時使用的環(huán)境。隨后,將創(chuàng)建一個名為all_posts的空列表。此列表將包含我們處理后的所有帖子?,F(xiàn)在,我們進(jìn)入for循環(huán)并遍歷POSTS_DIR中找到的所有文章。

          我們啟動for循環(huán),并打印當(dāng)前正在處理的post的路徑。如果有什么東西出問題了,這尤其有用。然后我們就知道,哪個文章的轉(zhuǎn)換失敗了。

          接下來,我們在默認(rèn)url之后增加一部分。假設(shè)我們有一篇標(biāo)題為“面向初學(xué)者的Python”的文章。我們將文章存儲在一個名為python-for-beginners.md,的文件中,因此生成的url將是http://0.0.0.0:5000/posts/python-for-beginners。

          變量url_html存儲的字符串與url相同,只是我們在末尾添加了.html。我們使用此變量定義另一個稱為target_file.的變量。變量指向存儲相應(yīng)HTML文件的位置。

          最后,我們定義了一個變量md,它表示markdown.Markdown的實例,用于將markdown代碼轉(zhuǎn)換為HTML。您可能會問自己,為什么我們沒有在for循環(huán)之前實例化這個實例,而是在內(nèi)部實例化。當(dāng)然,對于我們這里的小例子來說,這沒有什么區(qū)別(只是執(zhí)行時間稍微短一點)。但是,如果使用諸如腳注之類的擴(kuò)展來使用腳注,則需要為每個帖子實例化一個新實例,因為腳注添加后就不會從此實例中刪除。因此,如果您的第一篇文章使用了一些腳注,那么即使您沒有明確定義它們,所有其他文章也將具有相同的腳注。

          讓我們轉(zhuǎn)到for循環(huán)中的第一個with代碼塊。

          實際上,with代碼塊打開當(dāng)前post并將其內(nèi)容讀入變量content。之后調(diào)用_md.convert將以markdown方式寫入的內(nèi)容轉(zhuǎn)換為HTML。隨后,env環(huán)境根據(jù)提供的模板BLOG_TEMPLATE_FILE(即layout.html如果你還記得的話)渲染生成的HTML。

          第二個with 代碼塊用于將第一個with 代碼塊中創(chuàng)建的文檔寫入目標(biāo)文件。

          以下三行代碼從元數(shù)據(jù)中獲取發(fā)布日期(被發(fā)布的日期),將其轉(zhuǎn)換為正確的格式(RFC 2822),并將其分配回文章的元數(shù)據(jù)。此外,生成的post_dict被添加到all_posts列表中。

          我們現(xiàn)在出了for循環(huán),因此,我們遍歷了posts目錄中找到的所有posts并對其進(jìn)行了處理。讓我們看看generate_entries函數(shù)中剩下的三行代碼。

          我們按日期倒序?qū)ξ恼逻M(jìn)行排序,所以首先顯示最新的文章。隨后,我們將文章寫到模板目錄一個新創(chuàng)建的index.html文件中。別把index.html錯認(rèn)為templates/shared目錄中的那個。templates/shared目錄中的是模板,這個是我們要使用Flask服務(wù)的生成的。

          最后我們在函數(shù)generate_entries之后添加以下if語句。

          這意味著如果我們通過命令行執(zhí)行文件,它將調(diào)用generate_entries函數(shù)。

          太棒了,我們完成了converter.py腳本!讓我們從項目的根目錄運(yùn)行以下命令來嘗試:

          您應(yīng)該看到一些正在轉(zhuǎn)換的文件的路徑。假設(shè)您編寫了兩篇文章或使用了GitHub存儲庫中的兩篇文章,那么您應(yīng)該在templates目錄中找到三個新創(chuàng)建的文件。首先是index.html,它直接位于templates目錄中,其次是templates/posts目錄中的兩個HTML文件,它們對應(yīng)于markdown文件。

          最后啟動Flask應(yīng)用程序并轉(zhuǎn)到http://0.0.0.0:5000。

          總結(jié)

          太棒了,你完成了這個系列的第一部分!在本文中,您已經(jīng)學(xué)習(xí)了如何利用Markdown包創(chuàng)建自己的Markdown to HTML生成器。您實現(xiàn)了整個管線,它是高度可擴(kuò)展的,您將在接下來的文章中看到這一點。

          希望你喜歡這篇文章。一定要和你的朋友和同事分享。如果你還沒有,考慮在Twitter上關(guān)注我@DahlitzF或者訂閱我的通知,這樣你就不會錯過任何即將發(fā)表的文章。保持好奇心,不斷編碼!

          參考文獻(xiàn)

          Bootstrap (http://getbootstrap.com/)

          Primer on Jinja Templating (https://realpython.com/primer-on-jinja-templating/)

          Bootstrap Card (https://getbootstrap.com/docs/4.4/components/card/)

          Python-Markdown Extensions (https://python-markdown.github.io/extensions/)

          Tweet

          英文原文:https://florian-dahlitz.de/blog/build-a-markdown-to-html-conversion-pipeline-using-python
          譯者:阿布銩

          、pom.xml添加依賴

          <!-- Apache HttpClient -->
          <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
             <version>4.5.13</version> <!-- 替換為您需要的版本 -->
          </dependency>
          
          <dependency>
             <groupId>org.json</groupId>
             <artifactId>json</artifactId>
             <version>20210307</version> <!-- 替換為您需要的版本 -->
          </dependency>

          二、Controller

          package com.example.demo.demos.web;
          
          import com.fasterxml.jackson.databind.ObjectMapper;
          import org.apache.http.HttpEntity;
          import org.apache.http.client.methods.CloseableHttpResponse;
          import org.apache.http.client.methods.HttpPost;
          import org.apache.http.entity.ContentType;
          import org.apache.http.entity.StringEntity;
          import org.apache.http.impl.client.CloseableHttpClient;
          import org.apache.http.impl.client.HttpClients;
          import org.apache.http.util.EntityUtils;
          import org.json.JSONObject;
          import org.springframework.web.bind.annotation.*;
          
          import java.io.IOException;
          import java.util.Arrays;
          import java.util.List;
          
          @RestController
          @RequestMapping("/api")
          public class MyController {
          
             @PostMapping("/sendData")
             public List<User> sendPostRequest(@RequestBody User user) {
                 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                     HttpPost httpPost = new HttpPost("http://192.168.88.144:8080/search");
          
                     // 設(shè)置請求頭
                     httpPost.setHeader("Content-Type", "application/json");
          
                     // 創(chuàng)建 JSON 數(shù)據(jù)
                     //String jsonData = "{\"name\":\"" + user.getName() + "\", \"age\":\"" + user.getAge() + "\"}";
          
                     // 創(chuàng)建 JSONObject 對象
                     JSONObject jsonData = new JSONObject();
                     // 添加鍵值對
                     jsonData.put("name", user.getName());
                     jsonData.put("age", user.getAge());
                     // 將 JSONObject 轉(zhuǎn)換為字符串
                     String jsonString = jsonData.toString();
          
                     // 創(chuàng)建請求實體
                     StringEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
                     httpPost.setEntity(entity);
          
                     // 發(fā)送請求并獲取響應(yīng)
                     try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                         if (response.getStatusLine().getStatusCode() == 200) {
                             // 處理成功響應(yīng)
                             HttpEntity responseEntity = response.getEntity();
                             String responseBody = EntityUtils.toString(responseEntity);
          
                             // 使用 Jackson 解析 JSON 數(shù)據(jù)
                             ObjectMapper objectMapper = new ObjectMapper();
          
                             // 將響應(yīng)轉(zhuǎn)換為 List<User> 對象
                             List<User> userList = Arrays.asList(objectMapper.readValue(responseBody, User[].class));
                             //一般情況下,第三方接口會返回 JSON 格式的數(shù)據(jù),您需要根據(jù)返回的 JSON 數(shù)據(jù)結(jié)構(gòu)創(chuàng)建對應(yīng)的 Java 類,并將返回的 JSON 數(shù)據(jù)解析為 Java 對象。
                             return userList;
                        } else {
                             // 處理錯誤響應(yīng)
                             throw new IOException("Error response from API, status code: " + response.getStatusLine().getStatusCode());
                        }
                    }
                } catch (IOException e) {
                     throw new RuntimeException("Error while sending request: " + e.getMessage());
                }
            }
          }

          三、HTML


          主站蜘蛛池模板: 精品女同一区二区三区在线| 伊人久久精品无码av一区| 久久99精品免费一区二区| 国产成人高清亚洲一区91| 无码国产精品一区二区免费虚拟VR| 精品一区二区三区在线视频观看 | 相泽南亚洲一区二区在线播放 | 中文字幕一区二区三区有限公司| 国产精品乱码一区二区三区| 精品国产一区二区三区在线观看| 亚洲AV无码一区二区乱孑伦AS| 亚洲一区在线免费观看| 久久一区二区三区精华液使用方法| 波多野结衣在线观看一区| 久久精品国产一区二区三区日韩| 麻豆AV一区二区三区| 精品乱码一区二区三区在线| 伊人激情AV一区二区三区| 国产精品合集一区二区三区 | 精品视频午夜一区二区| 亚洲夜夜欢A∨一区二区三区| 国产香蕉一区二区在线网站| 精品女同一区二区三区在线| 日韩精品乱码AV一区二区| 国产精品亚洲专区一区| 国产品无码一区二区三区在线蜜桃| 精品成人乱色一区二区| 亚洲毛片不卡av在线播放一区| 老熟女五十路乱子交尾中出一区| 国产亚洲福利精品一区二区| 国产亚洲日韩一区二区三区| 国产精品无码一区二区在线观一| 日本免费一区二区久久人人澡| 国精产品999一区二区三区有限 | 国产视频一区在线观看| 亚洲AV无码一区二区三区国产| 精品福利一区3d动漫| 国模精品一区二区三区| 久久国产精品一区| 一区二区无码免费视频网站| 精品国产AⅤ一区二区三区4区|