RestEasy Web服務客戶端調用

RestEasy  Web服務客戶端調用


個人博客 http://blog.csdn.net/nndtdx
  • 背景

在前幾篇文章中,我介紹了用RestEasy 框架搭建的Rest風格的java web服務。這幾天事情比較多,一直沒有寫客戶端的調用方法。現在就談一下客戶端的調用方法。
首先,如果你還不知道如何利用RestEasy 構建Rest風格的Web服務。請查看與web服務相關的概念以及如何利用RestEasy搭建webservice的文章。

  • 編碼測試

本來想用Android做個客戶端,然後將測試代碼寫在android應用程序中。結果發現我將搭載有webservice的gae運行起來之後,利用http://ip:port不能在Android客戶單中訪問。令人鬱悶。瀏覽器中輸入http://localhost:port 居然沒有問題,可以正常調用使用。我想肯定在Android中是無法解析localhost.自然無響應。我試圖利用本機ip問。結果以在GAE平臺上,run之後,只能用http://localhost:port訪問,使用ip連不上,我狠鬱悶。
到最後,不得不寫了幾個測試用例。
如果你還不知道如何在GAE中搭建單元測試,可以看該文章。http://blog.csdn.net/nndtdx/article/details/6767352

下面是代碼,這裏主要測試兩個方法,一個是listallbook即get方式提交,另外一個是addbook使用post提交。方法如下

導入名空間

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.Assert;
import org.junit.internal.runners.statements.Fail;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import java.util.*;

下邊的代碼直接是單元測試的幾個方法,在於 gaerest項目在一塊,所以localhost是可以訪問的。


	String urlRoot = "http://localhost:8888/gaerest/";
	

	@Test
	public void listBooksTest() {

		HttpClient httpClient = new DefaultHttpClient();
		String urllistallbook = urlRoot + "library/books/";

		HttpGet httpGet = new HttpGet(urllistallbook);
		try {
			HttpResponse response = new DefaultHttpClient().execute(httpGet);
			int code = response.getStatusLine().getStatusCode();
			//204服務器已經處理成功,但沒有返回任何數據
			if (code == 200 || code==204) {
				String content = EntityUtils.toString(response.getEntity());
				System.out.println("listaoobook輸出===>" + content);
			} else {
				System.err.println("建立請求失敗,返回狀態碼==》" + code);
				Assert.fail("listbooks");
			}

		} catch (Exception e) {
			// TODO: handle exception
			Assert.fail("listbooks失敗" + e.getMessage());
		}

	}

	@Test
	public void	 addBookTest() {
		HttpClient httpClient = new DefaultHttpClient();
		String urlString=urlRoot+"library/book/mybook/";
		HttpPost httpPost=new HttpPost(urlString);
		List<NameValuePair> params=new ArrayList<NameValuePair>();
		params.add( new BasicNameValuePair("content", "this is my book content")  );
		try {
			UrlEncodedFormEntity entity=new UrlEncodedFormEntity(params,HTTP.UTF_8);
			httpPost.setEntity(entity);
			HttpResponse response=httpClient.execute(httpPost);
			int code= response.getStatusLine().getStatusCode();
			if(code==200){
				String reString=EntityUtils.toString(response.getEntity());
				System.out.println(reString);
				this.listBooksTest();
				
			}else{
				Assert.fail("addbooktest===》"+code);
			}
			  
		} catch (Exception e) {
			Assert.fail("addbookTest"+e.getMessage()+e.getStackTrace());
		}


 

這裏主要是用了Apache提供的幾個類。構建不同的請求方式對象,然後調用HttpClient進行執行。不過需要注意,上邊很多類在Android中也有提供相同的類,寫的時候,注意選擇是那個裏邊的類。
GET方式很好理解,就是請求一個url即可。Post方式只需要將數據放在請求實體中即可。
運行單元測試,完美通過。查看輸出,可以看到列出的數目已經增加了,說明post方法沒有問題。
接下來還要處理一個gae 的webservice如果在開發階段,我如何將其發佈到本地,使其通過本地ip在模擬器中可以訪問呢?思考中。目前就先依賴單元測試吧。


隨後會加上Android客戶端類的調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章