RESTful WebService
RESTful WebService
蜡笔小小小新 发表于2年前
RESTful WebService
  • 发表于 2年前
  • 阅读 101
  • 收藏 1
  • 点赞 1
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

摘要: 什么是REST? REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用...

1 导Jersey的jar包

Jersey只是支持REST服务的框架之一。


2 配置REST服务

就是在web.xml配置一个servlet。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>RESTSample</display-name>
  
  <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
    <servlet>
        <servlet-name>test</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.lin.rest.service</param-value><!-- 这个包下的类全部发布为rest服务 -->
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>


3 资源

package com.lin.rest.service;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.lin.rest.domain.User;

@Path("/service")
public class Service {
    
    @Path("/method_post")
    @POST
    @Produces(MediaType.TEXT_PLAIN)//返回给客户端的格式是什么,有字符串,json,html,xml等
    public void servicePOST(@FormParam("name") String name)
    {
        System.out.println("Service. Method:POST..."+name);
    }
    
//    @Path("/service/get")
//    @GET
//    @Produces(MediaType.TEXT_HTML)
//    public String serviceGet(@QueryParam("name") String name)
//    {
//        return "Service. Method:POST...";
//    }
    
    @Path("/method_get")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public User serviceGetObject(@QueryParam("id") int id)
    {
        return new User(id, "test@123.com", "test123");
    }

}


处理post请求的方法参数用@FormParam注解,处理get请求的方法参数用@QueryParam注解

4 访问

运行Tomcat后在浏览器访问:

http://localhost:8080/RESTSample/rest/service/method_get?id=1

这是在浏览器看到的就是服务返回的结果了。


5 如何返回一个对象

5.1 自定义一个对象

有时需要返回一个对象,那么需要在类上加上@XmlRootElement注解。比如服务返回一个user对象

package com.lin.rest.domain;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
    
    private int id;
    private String email;
    private String password;
    
    public User() {
    }

    public User(int id, String email, String password) {
        super();
        this.id = id;
        this.email = email;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", email=" + email + ", password=" + password
                + "]";
    }

}


5.2 资源

设置返回的类型是XML。

@GET
    @Produces(MediaType.APPLICATION_XML)
    public User serviceGetObject(@QueryParam("id") int id)
    {
        return new User(id, "test@123.com", "test123");
    }


5.3 访问服务


另外还可以返回JSON哟!把返回类型设置成json就行了。。。

@GET
    @Produces(MediaType.APPLICATION_JSON)
    public User serviceGetObject(@QueryParam("id") int id)
    {
        return new User(id, "test@123.com", "test123");
    }


访问服务


能得到json就比较亲切了,接下来有可以干很多事情了。。。。。


5.4 java怎么访问REST服务

不像SAOP webservice访问那么方便,SAOP webservice提供一个wsdl文档,通过CXF帮助直接生成一些服务端代理。

访问REST服务就是访问一个HTTP接口吧。apache的HttpClient可以给我们提供更加便利的帮助。

首先需要的jar包:

  1. httpclient-4.4.jar

  2. httpcore-4.4.jar

  3. commons-logging-1.2.jar

  4. commons-codec-1.9.jar


访问http get方法:

package com.lin.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class InvokeREST {

    public static void main(String[] args) {

        try {

            CloseableHttpClient httpClient = HttpClients.createDefault();
            //也可以封装成URI对象
//URI uri = new URIBuilder().setScheme("http")
  //                  .setHost("localhost").setPath(":8080/RESTSample/rest/service/method_get")
        //            .setParameter("id", "1").build();
            HttpGet get = new HttpGet("http://localhost:8080/RESTSample/rest/service/method_get?id=1");
            
            get.addHeader("User-Agent", "Mozilla/5.0");
            CloseableHttpResponse httpResponse = httpClient.execute(get);

            System.out.println("GET Response Status:: "
                    + httpResponse.getStatusLine().getStatusCode());
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpResponse.getEntity().getContent()));
            
            String inputLine;
            StringBuffer response = new StringBuffer();
            while((inputLine = reader.readLine()) != null)
            {
                response.append(inputLine);
            }
            
            System.out.println(response.toString());
            /**
             * close client
             */
            httpClient.close();
            reader.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}


运行结果:




访问http post方法:

package com.lin.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

public class InvokeREST {

    public static void main(String[] args) {
        
        try {
            
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost("http://localhost:8080/RESTSample/rest/service/method_post");
            httpPost.addHeader("User-Agent", "Mozilla/5.0");

            List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();//表单参数
            urlParameters.add(new BasicNameValuePair("name", "Chi Lin"));

            HttpEntity postParams = new UrlEncodedFormEntity(urlParameters);
            httpPost.setEntity(postParams);

            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);

            System.out.println("POST Response Status:: "
                    + httpResponse.getStatusLine().getStatusCode());

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpResponse.getEntity().getContent()));

            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = reader.readLine()) != null) {
                response.append(inputLine);
            }
            reader.close();

            // print result
            System.out.println(response.toString());
            httpClient.close();
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }
}


运行结果:


此时response status是204,说明post请求成功。因为服务方法没有返回值,所以空指针。。。

标签: java http RESTful
共有 人打赏支持
粉丝 29
博文 112
码字总数 79661
×
蜡笔小小小新
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: