您好,欢迎访问姐妹文库,我们提供范文大全,个人简历,教案下载,课件中心,优秀作文,考试辅导,试题库,诗词鉴赏等

收藏

IT计算机 频道

互联网|电脑基础知识|软件及应用|硬件及网络|

restful服务端及客户端开发

字体大小:[日期:2017-11-27]阅读:

导读:Restful 服务端及客户端调用实例
1. 新建 web 工程作为服务端?创建服务端代码
前情提示:

GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UP

Restful 服务端及客户端调用实例 1. 新建 web 工程作为服务端?创建服务端代码 前情提示: GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 DELETE(DELETE):从服务器删除资源。 2.服务端代码(每个方法前有注释,包括单参数,多参数, post,get 方式的例子) packagecom.eviac.blog.restws; importjavax.ws.rs.Consumes; importjavax.ws.rs.DefaultValue; importjavax.ws.rs.FormParam; importjavax.ws.rs.GET; importjavax.ws.rs.POST; importjavax.ws.rs.Path; importjavax.ws.rs.PathParam; importjavax.ws.rs.Produces; importjavax.ws.rs.core.MediaType; importnet.sf.json.JSONObject; importcom.alibaba.fastjson.JSONArray; /** * * @author pavithra * */ // 这里@Path 定义了类的层次路径。 // 指定了资源类提供服务的 URI 路径。 @Path("UserInfoService") public class UserInfo { // @GET 表示方法会处理 HTTP GET 请求 @GET // 这里@Path 定义了类的层次路径。指定了资源类提供服务的 URI 路径。 @Path("/name/{i}") // @Produces 定义了资源类方法会生成的媒体类型。 @Produces(MediaType.TEXT_XML) // @PathParam 向@Path 定义的表达式注入 URI 参数值。 public String userName(@PathParam("i") String i) { String name = i; return "<User>" + "<Name>" + name + "</Name>" + "</User>"; } @GET // 这里@Path 定义了类的层次路径。指定了资源类提供服务的 URI 路径。 @Path("/userinfo/{id}") // @Produces 定义了资源类方法会生成的媒体类型 //@Consumes(MediaType.APPLICATION_JSON) //传 json @Produces(MediaType.APPLICATION_JSON) // @PathParam 向@Path 定义的表达式注入 URI 参数值。 public String userJson(@PathParam("id") String id) { //JSONObjectjobj=JSONObject.fromObject(id); //id=jobj.getString("id"); return "{\"name\":\"hanzl\",\"age\":1,\"id\":"+"\""+id+"\"}"; } //多参数测试 @POST // 这里@Path 定义了类的层次路径。指定了资源类提供服务的 URI 路径。 @Path("/user2info") // @Produces 定义了资源类方法会生成的媒体类型 //@Consumes(MediaType.APPLICATION_JSON) //传 json //多参数配置 @Consumes({ MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_FORM_ URLENCODED}) @Produces(MediaType.APPLICATION_JSON) //返回 json // @PathParam 向@Path 定义的表达式注入 URI 参数值。 public String user2Json(@FormParam("id") String id,@FormParam("name") String name) { System.out.println(id); System.out.println(name); return "{\"name\":"+"\""+name+"\""+",\"age\":1,\"id\":"+"\""+id+"\"}"; } //多参数测试 @POST 参数为 json // 这里@Path 定义了类的层次路径。指定了资源类提供服务的 URI 路径。 @Path("/user3info") // @Produces 定义了资源类方法会生成的媒体类型 //@Consumes(MediaType.APPLICATION_JSON) //传 json //多参数配置 @Consumes({ MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_FORM_ URLENCODED}) @Produces(MediaType.APPLICATION_JSON) //返回 json // @PathParam 向@Path 定义的表达式注入 URI 参数值。 public String user3Json(@FormParam("id") String id) { System.out.println(id); return "{\"name\":\"hanzl\",\"age\":1,\"id\":"+"\""+id+"\"}"; } @GET @Path("/age/{j}") @Produces(MediaType.TEXT_XML) public String userAge(@PathParam("j") int j) { int age = j; return "<User>" + "<Age>" + age + "</Age>" + "</User>"; } } 3. 配 置 服 务 端 web.xml ( restful 接 口 发 布 地 址 ) 在 web.xml 中加入如下配置 <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <init-param> <param-name> com.sun.jersey.config.property.packages </param-name> <param-value>com.eviac.blog.restws</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> 4.编写客户端代码 4.1 新建 java 工程 来进行服务端的第一次调用: packagecom.eviac.blog.restclient; importjavax.ws.rs.core.MediaType; importcom.sun.jersey.api.client.Client; importcom.sun.jersey.api.client.ClientResponse; importcom.sun.jersey.api.client.WebResource; importcom.sun.jersey.api.client.config.ClientConfig; importcom.sun.jersey.api.client.config.DefaultClientConfig; /** * * @author pavithra * */ public class UserInfoClient { public static final String BASE_URI = "http://localhost:8080/RestflService"; public static final String PATH_NAME = "/UserInfoService/name/"; public static final String PATH_AGE = "/UserInfoService/age/"; public static void main(String[] args) { String name = "Pavithra"; int age = 25; ClientConfigconfig = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(BASE_URI); WebResourcenameResource = resource.path("rest").path(PATH_NAME + name); System.out.println("Client Response \n" + getClientResponse(nameResource)); System.out.println("Response \n" + getResponse(nameResource) + "\n\n"); WebResourceageResource = resource.path("rest").path(PATH_AGE + age); System.out.println("Client Response \n" + getClientResponse(ageResource)); System.out.println("Response \n" + getResponse(ageResource)); } /** * 返回客户端请求。例如: GET * http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra * 返回请求结果状态“200 OK” 。 * * @param service * @return */ private static String getClientResponse(WebResource resource) { returnresource.accept(MediaType.TEXT_XML).get(ClientResponse.class) .toString(); } /** * 返回请求结果 XML 例如:<User><Name>Pavithra</Name></User> * * @param service * @return */ private static String getResponse(WebResource resource) { returnresource.accept(MediaType.TEXT_XML).get(String.class); } } 调用结果: 4.2get 方式还可以直接从浏览器直接调用 浏览器调用: 以上这些都是单纯的 get 方式提交的数据可使用 5.客户端调用我这有两种方式 HttpURLConnection,HttpClient 两种 5.1HttpURLConnection 调用 restful 接口 代码如下: packagecom.eviac.blog.restclient; /**** * 测试 get 请求方式,请求数据为单个参数,返回结果为 json * get 方法提交 * 返回数据 json */ importjava.io.BufferedInputStream; importjava.io.BufferedReader; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; import java.net.URL; public class JavaNetURLRESTFulClient { //post 方式 public static String postDownloadJson(String path,String post){ URL url = null; //接口的地址 path="http://localhost:8080/RestflService/rest/UserInfoService/userinfo"; //请求的参数 post="id=\"{\"id\":\"11\"}\""; try { url = new URL(path); HttpURLConnectionhttpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式 // conn.setConnectTimeout(10000);//连接超时单位毫秒 // conn.setReadTimeout(2000);//读取超时单位毫秒 // 发送 POST 请求必须设置如下两行 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); //httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 获取 URLConnection 对象对应的输出流 PrintWriterprintWriter = new PrintWriter(httpURLConnection.getOutputStream()); // 发送请求参数 printWriter.write(post);//post 的参数 xx=xx&yy=yy // flush 输出流的缓冲 printWriter.flush(); //开始获取数据 BufferedInputStreambis = new BufferedInputStream(httpURLConnection.getInputStream()); ByteArrayOutputStreambos = new ByteArrayOutputStream(); intlen; byte[] arr = new byte[1024]; while((len=bis.read(arr))!= -1){ bos.write(arr,0,len); bos.flush(); } bos.close(); returnbos.toString("utf-8"); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { try { String id="123"; String targetURL = "http://localhost:8080/RestflService/rest/UserInfoService/userinfo/"; targetURL+=id; URL restServiceURL = new URL(targetURL); HttpURLConnectionhttpConnection = (HttpURLConnection) restServiceURL.openConnection(); httpConnection.setRequestMethod("GET"); //返回 xml //httpConnection.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); //返回 json httpConnection.setRequestProperty("Accept", "application/json"); if (httpConnection.getResponseCode() != 200) { throw new RuntimeException("HTTP GET Request Failed with Error code : " + httpConnection.getResponseCode()); } BufferedReaderresponseBuffer = new BufferedReader(new InputStreamReader( (httpConnection.getInputStream()))); String output; System.out.println("Output from Server: \n"); while ((output = responseBuffer.readLine()) != null) { System.out.println(output); } //解析 json httpConnection.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // postDownloadJson(null,null); } 5.2HttpClient 调用 restful 接口(post & get 方式) 代码如下: packagecom.eviac.blog.restclient; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importorg.apache.commons.httpclient.HttpClient; importorg.apache.commons.httpclient.HttpException; importorg.apache.commons.httpclient.NameValuePair; importorg.apache.commons.httpclient.methods.GetMethod; importorg.apache.commons.httpclient.methods.PostMethod; public class RestClient { public static void main(String[] args) { String urlpost = "http://localhost:8080/RestflService/rest/UserInfoService/user3info"; String urlget = "http://localhost:8080/RestflService/rest/UserInfoService/name/1"; HttpClient client = new HttpClient(); //POST 方法 GetMethodgetmethod=new GetMethod(urlget); PostMethod method = new PostMethod(urlpost); NameValuePair[] data = { newNameValuePair("id", "{\"id\":\"11\"}")}; method.setRequestBody(data); try { intstatusCode = client.executeMethod(method); if (statusCode == 200) { // String strJson = method.getResponseBodyAsString(); // System.out.println("post 方法="+strJson); BufferedReader reader = new InputStreamReader(method.getResponseBodyAsStream())); StringBufferstringBuffer = new StringBuffer(); String str = ""; while((str = reader.readLine())!=null){ stringBuffer.append(str); } String ts = stringBuffer.toString(); System.out.println("post 方法="+ts); } } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } BufferedReader(new //执行 get 方法 try { intstatusCode = client.executeMethod(getmethod); if (statusCode == 200) { String strJson = getmethod.getResponseBodyAsString(); System.out.println("get 方法="+strJson); // System.out.println(map.get("user").getUsername()); } } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 5.3HttpURLConnection 调用 restful 接口(post,多参数) 服务端方法配置: //多参数测试 @POST // 这里@Path定义了类的层次路径。指定了资源类提供服务的URI 路径。 @Path("/user2info") // @Produces定义了资源类方法会生成的媒体类型 //@Consumes(MediaType.APPLICATION_JSON) //传json //多参数配置 @Consumes({ MediaType.MULTIPART_FORM_DATA,MediaType.A PPLICATION_FORM_URLENCODED}) @Produces(MediaType.APPLICATION_JSON) //返回json // @PathParam向@Path定义的表达式注入URI参数值。 public String user2Json(@FormParam("id") String id,@FormParam("name") String name) { System.out.println(id); System.out.println(name); return"{\"name\":"+"\""+name+"\""+",\"age\":1,\"id\": "+"\""+id+"\"}"; } 客户端调用:代码 packagecom.eviac.blog.restclient; importjava.io.BufferedInputStream; importjava.io.BufferedReader; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; import java.net.URL; /** * * @author Hanlong * 多参数配置 * 请求数据为为多个参数 * 返回结果是Json * 放在body体里 * Post方法提交 */ public class Test2paras { //post方式 public static String postDownloadJson(String path,String post){ URL url = null; path="http://localhost:8080/RestflService/rest/U serInfoService/user2info"; post="{\"id\":\"11\"}\""; String post1="id=1&name=hanzl"; try { url = new URL(path); HttpURLConnectionhttpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("POST");// 提 交模式 // conn.setConnectTimeout(10000);//连 接超时单位毫秒 // conn.setReadTimeout(2000);//读取超 时单位毫秒 // 发送POST请求必须设置如下两行 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); //httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 获取URLConnection对象对应的输出流 PrintWriterprintWriter = new PrintWriter(httpURLConnection.getOutputStream()); // 发送请求参数 printWriter.write(post1);//post的参数 xx=xx&yy=yy // flush输出流的缓冲 printWriter.flush(); //开始获取数据 BufferedInputStreambis = new BufferedInputStream(httpURLConnection.getInputStream( )); ByteArrayOutputStreambos = new ByteArrayOutputStream(); intlen; byte[] arr = new byte[1024]; while((len=bis.read(arr))!= -1){ bos.write(arr,0,len); bos.flush(); } bos.close(); returnbos.toString("utf-8"); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { System.out.println(postDownloadJson(null,null)); } } 5.4HttpURLConnection 调用 restful 接口 (post, 参数为 json, 返回参数为 json) 服务端 //多参数测试参数为json @POST // 这里@Path定义了类的层次路径。指定了资源类提供服务的URI 路径。 @Path("/user3info") // @Produces定义了资源类方法会生成的媒体类型 //@Consumes(MediaType.APPLICATION_JSON) //传json //多参数配置 @Consumes({ MediaType.MULTIPART_FORM_DATA,MediaType.A PPLICATION_FORM_URLENCODED}) @Produces(MediaType.APPLICATION_JSON) //返回json // @PathParam向@Path定义的表达式注入URI参数值。 public String user3Json(@FormParam("id") String id) { System.out.println(id); return"{\"name\":\"hanzl\",\"age\":1,\"id\":"+"\""+id +"\"}"; } 客户端代码 packagecom.eviac.blog.restclient; importjava.io.BufferedInputStream; importjava.io.BufferedReader; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; import java.net.URL; /** * * @author Hanlong * 多参数配置 * 请求数据 json * 返回结果是 Json * Post 方法提交 */ public class TestJsonparams { //post 方式 public static String postDownloadJson(String path,String post){ URL url = null; path="http://localhost:8080/RestflService/rest/UserInfoService/user3info"; post="id={\"id\":\"11\"}\""; String post1=post; try { url = new URL(path); HttpURLConnectionhttpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式 // conn.setConnectTimeout(10000);//连接超时单位毫秒 // conn.setReadTimeout(2000);//读取超时单位毫秒 // 发送 POST 请求必须设置如下两行 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); //httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 获取 URLConnection 对象对应的输出流 PrintWriterprintWriter = new PrintWriter(httpURLConnection.getOutputStream()); // 发送请求参数 printWriter.write(post1);//post 的参数 xx=xx&yy=yy // flush 输出流的缓冲 printWriter.flush(); //开始获取数据 BufferedInputStreambis = new BufferedInputStream(httpURLConnection.getInputStream()); ByteArrayOutputStreambos = new ByteArrayOutputStream(); intlen; byte[] arr = new byte[1024]; while((len=bis.read(arr))!= -1){ bos.write(arr,0,len); bos.flush(); } bos.close(); returnbos.toString("utf-8"); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { System.out.println(postDownloadJson(null,null)); } } 6.项目完整包(附件带 jar 包) restful接口客户端&服务端.rar

热门图片