インタフェース試験アナログデータ要求の後四種類

https://www.jianshu.com/p/3b6d7aa2043a

 

I.背景

インタフェースの通常の試験では、アナログインターフェース要求は、一般に、2つの方法、シミュレーションおよびフィドラーHttpClientをシミュレーションしています。

フィドラーは、単純なプロキシHTTPプロトコルのデバッグツール、それはユーザーフレンドリー、操作しやすく、アナログhttpリクエストの武器の一つです。
そして、私たちはしばしばのHttpClientキット言って、アパッチ財団HttpComponentプロジェクトの不可欠な部分をトレースし。HttpComponent 3つの主要コンポーネント、すなわちHttpCore、HttpClientをとAsynchHttpClientがあります。公式ウェブサイト上で説明したようにHttpComponent、HttpCore HTTPが基本となるトランスポートコンポーネントで、HTTPは、クライアントとサーバーを要求アナログ最小限のメモリで実現。HttpClientをHTTPのリクエスト・モデルエージェントを達成HttpCoreをベースに、効率的、新しい、機能豊富なクライアントのサポートHTTPプロトコルのプログラミングツールキットを提供するために使用することができます。同時要求の多数を処理するときに非同期のHttpClientもベースHttpCore名前が示唆するように、HTTPプロキシです。シミュレーションのこれらの2つの方法の異なる処理による異なるフォーマットのデータ。

テストインタフェースでは、インタフェースは、通常、要求またはGETリクエストを投稿しています。要求されたテストを入手するには、正しく書くために、関連するリクエストヘッダ、URLを設定し、一般的に比較的簡単です。ポスト要求をテストする場合しかし、要求フォーマットは、多くの場合、多少複雑なデータを設定します。特に不明瞭な記述開発者インタフェースドキュメントの場合には、テストの効率に影響を与えます。

本論文では、したがって、4つの一般的なポストの要求とそれに対応するデータ形式シオマネキ、HttpClientをシミュレーション構成要求メソッドをまとめたもの。


二、ポストリクエストボディの説明

 一个正常的post请求主要包括请求行,请求头,请求主体,也就是
 <method><url><version> <headers> <entity-body> 

取得要求がエンティティボディのボディのための要求ではありません。POSTリクエストの場合は、要求を送信するためのデータ形式は、理論的には、あなたが任意のデータを送信することができ、制限されることはありませんが、サーバーが処理できない別の問題です。サーバーがデータを受信した後、どのようにデータを解釈するには?これは、データ分析を実行するために提供されたコンテンツのContent-Typeヘッダを要求されます。良質なコンテンツタイプのフォーマットを決定した後、リクエストボディのデータフォーマットも決定します。Content-Typeの4つの形式:即ち、アプリケーション/ X-WWW-フォーム- (URLエンコードデフォルトフォーマットである)、アプリケーション/ JSON、テキスト/ XML およびマルチパート/フォームデータフォーマット。
データ形式にこれらの異なるポスト要求はHttpEntityによって構成されているすべての必要POSTリクエストデータ送信がHttpEntityエンティティを配置するので、HttpClientをHttpEntity単純なヘアカットを施すことが必要です。HttpEntityは、より一般的に使用される多くは、(StringEntityから継承)StringEntity、UrlEncodedFormEntity、MultipartEntityであり、インターフェイスのこの特定のタイプを達成するため、インターフェースです。異なる形式のPOSTリクエストを送信するとき、彼らが使用されます。次に、各要求シオマネキアナログおよびアナログHTTPClientの要求(Java実装)実績に対応したデータ形式の詳細。


3つのまたは4つのポスト要求データ形式や構成はシオマネキやアナログHttpClientを要請します

(A)アプリケーション/ x-www-form-urlencodedでデータ・フォーマット

W3C网官ご覧ください上明确对这种数据格式进行了定义:
これがデフォルトのコンテンツタイプです。このコンテンツタイプに提出フォームは、次のように符号化しなければならない
コントロールの名前と値がエスケープされます。記載のようにスペース文字が「+」、次いで予約文字で置き換えられているエスケープされ[RFC1738]、セクション2.2:英数字以外の文字は「%HH」、パーセント記号とのASCIIコードを表す2桁の16進数に置き換えられていますキャラクター。改行は「CR LF」のペア(すなわち、「の%0D%0A」)として表現されている。コントロール名/値は、それらがドキュメントに表示順に表示されます。名前は「=」で値から分離され、名前/値のペアは「&」によって互いに分離されています。

この投稿は、最も一般的な要求が提出されたデータのデフォルトのフォーマットです。等号が結合&の値に名前/値の他の組との間に接続されると、データの名前(名)とデータ値(値)との間に必要となります。たとえば、次のパラメーター1 = 12345&パラメータ2 = 23456 。要求されたコンテンツのフォーマットが、実際には、同時にクライアントを送信するための簡略化された方法であって、サーバは、サーバgetParameters(文字列名)によって送信された情報を得ることができる、単純化された取得します。
我々はシオマネキやHttpClientを言葉でPOSTリクエストをシミュレートする方法を見て。
(1)アナログシオマネキリクエスト、リクエストヘッダと要求されたコンテンツは、本体を構成することができる場合。

 

 

シミュレーション要求したら、私たちの要求データへの復帰の結果を表示することができます。

 

 

(2)アナログのHttpClient POST要求した場合、その要求は、そのように構成してもよいです。

DefaultHttpClient client = new DefaultHttpClient(); List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); //定义键值对列表,用于存放向url发送post请求的数据。 params.add(new BasicNameValuePair("parameter1", "12345")); params.add(new BasicNameValuePair("parameter2", "23456")); //向params设置数据 HttpPost post = new HttpPost("http://example.com"); //定义HttpPost对象并初始化它 HttpEntity reqEntity = new UrlEncodedFormEntity(params); //用UrlEncodedFormEntity对象包装请求体数据 post.setEntity(reqEntity); //设置post请求实体 HttpResponse response = client.execute(post); //发送http请求 System.out.println("the request body is:"+EntityUtils.toString(reqEntity)); //打印出请求实体 System.out.println(response.getStatusLine().getStatusCode()); //打印http请求返回码 

**(b)は、アプリケーション/ JSONデータ形式**
ファイルアプリケーション/ JSON要求ヘッダフォーマットは、サーバに通知するために使用されるJSONストリングが直列化され過ぎて、メッセージ本文を投稿することを指します。
(1)アナログシオマネキリクエスト、リクエストヘッダと要求されたコンテンツは、本体を構成することができる場合。

 

 

シミュレーション要求した後、我々は結果から要求されたデータのリターンを見ることができます:

 

 

 

(2)アナログのHttpClient POST要求した場合、その要求は、そのように構成してもよいです。

 HttpClient client = new DefaultHttpClient(); JSONObject js = new JSONObject(); //定义一个JSON数据格式对象,用其保存请求主体数据。 js.element("parameter1", "12345"); //为JSON对象的各个key值赋值 js.element("parameter2","23456"); String postRequest = js.toString(); HttpPost post = new HttpPost("http://example.com"); //定义HttpPost对象并初始化它 StringEntity reqEntity = new StringEntity(js.toString()); //用StringEntity对象包装请求体数据 reqEntity.setContentType("application/json"); //设置请求头数据传输格式 post.setEntity(reqEntity); //设置post请求实体 HttpResponse response = client.execute(post); //发送http请求 System.out.println("the request body is:"+EntityUtils.toString(reqEntity)); //打印出请求实体 System.out.println(response.getStatusLine().getStatusCode()); //打印http请求返回码 

ここでは、HttpClientをアナログPOSTリクエストは、リクエストヘッダフォーマットがapplication / x-www-フォーム-で見つかった URLエンコードし、アプリケーション/ JSON主な違いは、リクエストボディのフォーマットの構造(前者は文字列JSONであるキーと値のペアである)であり異なる要求ボディデータをパッケージする方法(前者はStringEntityあるUrlEncodedFormEntity、です)。
**(C)テキスト/ XML **データフォーマット
(1)アナログシオマネキ要求、要求ヘッダーとリクエストボディは、コンテンツを構成することができる場合。

 

 

シミュレーション要求した後、我々は結果から要求されたデータのリターンを見ることができます:

 

 

(2)アナログのHttpClient POST要求した場合、その要求は、そのように構成してもよいです。

Document doc = DocumentHelper.createDocument(); //创建document对象 Element book = doc.addElement("book"); //构建document对象各个节点 book.addElement("title").addText("芈月传"); book.addElement("author").addText("蒋胜男"); String body = book.asXML(); //Document对象转成string类型 StringEntity reqEntity = new StringEntity(body); //用StringEntity对象包装请求体数据 reqEntity.setContentType("text/xml"); //设置请求头数据传输格式 reqEntity.setContentEncoding("utf-8"); //设置请求头数据编码格式 HttpPost post = new HttpPost("http://example.com"); //定义HttpPost对象并初始化它 post.setEntity(reqEntity); //设置post请求实体 HttpResponse response = client.execute(post); //发送http请求 System.out.println("the request body is:"+EntityUtils.toString(reqEntity)); //打印出请求实体 System.out.println(response.getStatusLine().getStatusCode()); //打印http请求返回码 

(四)multipart/form-data数据格式
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是MultipartEntity类。此类同样实现了HttpEntity接口。
(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:
第一步,先设置好请求头格式,然后点击upload file...

 

 

第二步,上传你的文件,这里我上传一个png的图片

 

 

这是fiddler根据我们上传的文件自动调整生成的请求,在请求头中看到,我们需要选择一段数据作为“分割边界”(boundary属性),这个“边界数据”不能在内容其他地方出现,一般来说使用一段从概率上说“几乎不可能”的数据即可。每次post浏览器都会生成一个随机的30-40位长度的随机字符串,浏览器一般不会遍历这次post的所有数据找到一个不可能出现在数据中的字符串,一般都是随机生成。选择了这个边界之后,浏览器便把它放在Content-Type 里面传递给服务器,服务器根据此边界解析数据。下面的数据便根据boundary划分段,每一段便是一项数据。(每个field被分成小部分,而且包含一个value是"form-data"的"Content-Disposition"的头部;一个"name"属性对应field的ID等等,文件的话包括一个filename)
模拟请求之后,从返回结果可以看到我们的请求数据:

 

(2)如果用HttpClient模拟post请求的话,请求可以这样构造:

HttpPost post = new HttpPost("http://example.com");           //定义HttpPost对象并初始化它
MultipartEntity mutiEntity = new MultipartEntity();           //定义MultipartEntity对象
File file = new File("C:\Users\hzsuixiang\Desktop\image_20151117151539.png");
mutiEntity.addPart("desc",new StringBody("网易云阅读", Charset.forName("utf-8")));     //设置multiEntity对象的主体数据
mutiEntity.addPart("pic", newFileBody(file));post.setEntity(mutiEntity);             //设置post请求主体
HttpResponse  httpResponse = client.execute(post);                                   //执行post请求
HttpEntity httpEntity =  httpResponse.getEntity();                                   //获得响应返回实体

综上,就是接口测试中fiddler与HttpClient模拟post接口四种请求数据的构造方法,总结起来有利于在以后的接口测试工组过程中可以及时查阅。另外,为了尽可能简化核心代码,列出的这些代码中并没有写出需要的jar包,大家使用的时候需要自行添加。

おすすめ

転載: www.cnblogs.com/wangcp-2014/p/11572428.html