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客戶端類的調用。