GVKun编程网logo

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件(golang 发送http请求)

16

如果您对Golang建立RESTfulwebservice接收客户端POST请求发送wav语音文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Golang建立RESTfu

如果您对Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件的详细内容,我们还将为您解答golang 发送http请求的相关问题,并且为您提供关于.net 从WebService的restful api接口以POST方式请求并获取返回值、android – Java jersey RESTful webservice请求、C++上传文件到Restful Web Service服务端——客户端篇、CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)的有价值信息。

本文目录一览:

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件(golang 发送http请求)

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件(golang 发送http请求)

首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务:

原文地址:http://www.jb51.cc/article/p-tonyjcqq-hg.html

package main
                        
//http://liuxp0827.blog.51cto.com/5013343/1412977                                                                                          
                      
import (
    "bufio"
    "github.com/go-martini/martini"
    "io/IoUtil"
    "log"
    "net/http"
    "os"
)
                                                                                                                                                                                                  
func main() {
    m := martini.Classic()
                                                                                                                                                                                                  
    m.Post("/wave",func(req *http.Request) {
        file,_,err := req.FormFile("file")
        if err != nil {
            log.Fatal("FormFile: ",err.Error())
            os.Exit(2)
        }
        defer func() {
            if err := file.Close(); err != nil {
                log.Fatal("Close: ",err.Error())
                os.Exit(2)
            }
        }()
                                                                                                                                                                                                  
        localFile,_ := os.Create("1.wav")
        defer localFile.Close()
        writer := bufio.NewWriter(localFile)
        bytes,err := IoUtil.ReadAll(file)
        if err != nil {
            log.Fatal("ReadAll: ",err.Error())
            os.Exit(2)
        }
                                                                                                                                                                                                  
        writer.Write(bytes)
        writer.Flush()
    })
                                                                                                                                                                                                  
    http.ListenAndServe(":8080",m)
}

再来看下客户端的java代码,首先调用readWavform函数从本地读取语音文件到byte[],然后设置相应的POST头信息,最终发送数据:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
                                                                                         
                    
//http://liuxp0827.blog.51cto.com/5013343/1412977
                                                              
public final class upload {
                                                                                                                                  
    public static void main(String[] args) {
        Map<String,String> parameters = new HashMap<String,String>();                                                                 
        byte[] data = readWavform("C:\\Users\\PONPON\\Desktop\\test.wav");
        doUploadFile("http://localhost:8080/wave",parameters,Constants.FILEParaM,"11.wav","multipart/form-data;",data);
    }
                                                                                                                                  
    public static byte[] readWavform(String filename) {
                                                                                                                                  
        int regLen = 0;
        byte[] regbuffer = null;
        try {
            FileInputStream inputsteam = new FileInputStream(new File(filename));
                                                                                                                                  
            regLen = inputsteam.available();
            regbuffer = new byte[regLen];
            if ((regLen = inputsteam.read(regbuffer,regLen)) < 0) {
                System.out.println("error when read pcm file.");
            }
                                                                                                                                  
        } catch (FileNotFoundException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        } catch (IOException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
                                                                                                                                  
        return regbuffer;
    }
                                                                                                                                  
    public static String doUploadFile(String reqUrl,Map<String,String> parameters,String fileParamName,String filename,String contentType,byte[] data) {
        HttpURLConnection urlConn = null;
        try {
            urlConn = sendFormdata(reqUrl,fileParamName,filename,contentType,data);
            String responseContent = new String(getBytes(urlConn));
            return responseContent.trim();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            if (urlConn != null) {
                urlConn.disconnect();
            }
        }
    }
                                                                                                                                  
    private static HttpURLConnection sendFormdata(String reqUrl,byte[] data) {
        HttpURLConnection urlConn = null;
        try {
            URL url = new URL(reqUrl);
            urlConn = (HttpURLConnection) url.openConnection();
            urlConn.setRequestMethod("POST");
            urlConn.setConnectTimeout(10000);// (单位:毫秒)jdk
            urlConn.setReadTimeout(10000);// (单位:毫秒)jdk 1.5换成这个,读操作超时
            urlConn.setDoOutput(true);
            urlConn.setRequestProperty("connection","keep-alive");
                                                                                                                                  
            String boundary = "-----------------------------114975832116442893661388290519"; // 分隔符
            urlConn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary);
                                                                                                                                  
            boundary = "--" + boundary;
            StringBuffer params = new StringBuffer();
            if (parameters != null) {
                for (Iterator<String> iter = parameters.keySet().iterator(); iter
                        .hasNext();) {
                    String name = iter.next();
                    String value = parameters.get(name);
                    params.append(boundary + "\r\n");
                    params.append("Content-disposition: form-data; name=\""
                            + name + "\"\r\n\r\n");
                    params.append(value);
                    params.append("\r\n");
                }
            }
            StringBuilder sb = new StringBuilder();
            sb.append(boundary);
            sb.append("\r\n");
            sb.append("Content-disposition: form-data; name=\"" + fileParamName
                    + "\"; filename=\"" + filename + "\"\r\n");
            sb.append("Content-Type: " + contentType + "\r\n\r\n");
            byte[] fileDiv = sb.toString().getBytes("UTF-8");
            byte[] endData = ("\r\n" + boundary + "--\r\n").getBytes("UTF-8");
            byte[] ps = params.toString().getBytes("UTF-8");
            OutputStream os = urlConn.getoutputStream();
            os.write(ps);
            os.write(fileDiv);
            os.write(data);
            os.write(endData);
            os.flush();
            os.close();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(),e);
        }
        return urlConn;
    }
    private static byte[] getBytes(HttpURLConnection urlConn) {
        try {
            InputStream in = urlConn.getInputStream();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            for (int i = 0; (i = in.read(buf)) > 0;)
                os.write(buf,i);
            in.close();
            return os.toByteArray();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(),e);
        }
    }
}

这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。

.net 从WebService的restful api接口以POST方式请求并获取返回值

.net 从WebService的restful api接口以POST方式请求并获取返回值

  • 最有效的:

  1. post位置

private void Logintest()
        {
            string resultState = string.Empty;


            try
            {
                var request = new Request();
                string jdata = "imei=1"+
                    "&contactid=1001"+
                    "&password=e10adc3949ba59abbe56e057f20f883e";
                var response = request.Execute("http://dumXXXXXX.com.cn/dum/app_login.action",jdata,"POST");


                JObject jo = (JObject)JsonConvert.DeserializeObject(response.ToString());
                resultState = jo["result"].ToString();
            }
            catch (Exception ex)
            {
                errorList.Add(ex.Message);
            }
            finally
            {
                switch (resultState)
                {
                    case "200":
                        resultStateDic["200(成功)"]++;
                        break;
                    case "401":
                        resultStateDic["401(失败)"]++;
                        break;
                    case "402":
                        resultStateDic["402(IMEI不匹配)"]++;
                        break;
                    case "403":
                        resultStateDic["403(没有权限)"]++;
                        break;
                    case "404":
                        resultStateDic["404(用户不存在)"]++;
                        break;
                    case "601":
                        resultStateDic["601(用户存在,但没有登记)"]++;
                        break;
                    default:
                        resultStateDic["other"]++;
                        break;
                }
            }
        }

Request类

/// <summary>
    /// Create Http Request,using json,and read Http Response.
    /// </summary>
    public class Request
    {
        /// <summary>
        /// Url of http server wich request will be created to.
        /// </summary>
        public String URL { get; set; }


        /// <summary>
        /// HTTP Verb wich will be used. Eg. GET,POST,PUT,DELETE.
        /// </summary>
        public String Verb { get; set; }


        /// <summary>
        /// Request content,Json by default.
        /// </summary>
        public String Content
        {
            //get { return "text/json"; }
            get { return "application/x-www-form-urlencoded"; }
        }


        /// <summary>
        /// User and Password for Basic Authentication
        /// </summary>
        public Credentials Credentials { get; set; }


        public HttpWebRequest HttpRequest { get; internal set; }
        public HttpWebResponse HttpResponse { get; internal set; }
        public CookieContainer CookieContainer = new CookieContainer();


        public object Execute(string url,object obj,string verb)
        {
            if (url != null)
                URL = url;


            if (verb != null)
                Verb = verb;


            HttpRequest = CreateRequest();


            WriteStream(obj);


            try
            {
                HttpResponse = (HttpWebResponse)HttpRequest.GetResponse();
            }
            catch (WebException error)
            {
                HttpResponse = (HttpWebResponse)error.Response;
                return ReadResponseFromError(error);
            }


            return ReadResponse();
        }


        internal HttpWebRequest CreateRequest()
        {
            var basicRequest = (HttpWebRequest)WebRequest.Create(URL);
            basicRequest.ContentType = Content;
            basicRequest.Method = Verb;
            basicRequest.CookieContainer = CookieContainer;


            if (Credentials != null)
                basicRequest.Headers.Add("Authorization","Basic" + " " + EncodeCredentials(Credentials));


            return basicRequest;
        }


        internal void WriteStream(object obj)
        {
            if (obj != null)
            {
                using (var streamWriter = new StreamWriter(HttpRequest.GetRequestStream()))
                {
                    if (obj is string)
                        streamWriter.Write(obj);
                    else
                        streamWriter.Write(JsonConvert.SerializeObject(obj));
                }
            }
        }


        internal String ReadResponse()
        {
            if (HttpResponse != null)
                using (var streamReader = new StreamReader(HttpResponse.GetResponseStream()))
                    return streamReader.ReadToEnd();


            return string.Empty;
        }


        internal String ReadResponseFromError(WebException error)
        {
            using (var streamReader = new StreamReader(error.Response.GetResponseStream()))
                return streamReader.ReadToEnd();
        }


        internal static string EncodeCredentials(Credentials credentials)
        {
            var strCredentials = string.Format("{0}:{1}",credentials.UserName,credentials.Password);
            var encodedCredentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(strCredentials));


            return encodedCredentials;
        }
    }

Credentials

/// <summary>
    /// This class support JsonRequest on sending credentials for Basic Authentication on HTTP server
    /// </summary>
    public class Credentials
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }

第三方dll

Newtonsoft.Json.dll

android – Java jersey RESTful webservice请求

android – Java jersey RESTful webservice请求

我一直在关注一个关于宁静服务的教程,它运行正常.然而,有一些我还不太了解的东西.这是它的样子:

@Path("/hello")
public class Hello {

    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces( MediaType.TEXT_PLAIN )
    public String sayPlainTextHello() 
    {
        return "Plain hello!";
    }

    @GET
    @Produces( MediaType.APPLICATION_JSON )
    public String sayJsonTextHello() 
    {
        return "Json hello!";
    }

    // This method is called if XML is request
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
    }

    // This method is called if HTML is request
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello() 
    {
        return "<html> " + "<title>" + "Hello fittemil" + "</title>"
                + "<body><h1>" + "Hello!" + "</body></h1>" + "</html> ";
    }
} 

困扰我的是我无法利用正确的操作.当我从浏览器请求服务时,会调用相应的sayHtmlHello()方法.但是现在我正在开发一个Android应用程序,我希望在Json中得到结果.但是当我从应用程序调用该服务时,将调用MediaType.TEXT_PLAIN方法.我的android代码看起来与此类似:

Make an HTTP request with android

如何从我的Android应用程序中调用使用MediaType.APPLICATION_JSON的方法?
此外,我想使该特定方法返回一个对象,如果我在那里得到一些指导,那将是很好的.

解决方法:

我个人有使用Jersey在Java(JAX-RS)中实现REST的经验.然后我通过Android应用程序连接到这个RESTful Web服务.

在Android应用程序中,您可以使用HTTP Client库.它支持HTTP命令,如POST,PUT,DELETE,GET.例如,使用GET命令并以JSON格式或TextPlain传输数据:

public class Client {

    private String server;

    public Client(String server) {
        this.server = server;
    }

    private String getBase() {
        return server;
    }

    public String getBaseURI(String str) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            httpconnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            httpconnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpGet getRequest = new HttpGet(getBase() + str);
            getRequest.addHeader("accept", "application/json");
            HttpResponse response = httpClient.execute(getRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } 
        return result;
    }

    public String getBaseURIText(String str) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            httpconnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            httpconnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpGet getRequest = new HttpGet(getBase() + str);
            getRequest.addHeader("accept", "text/plain");
            HttpResponse response = httpClient.execute(getRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

 private StringBuilder getResult(HttpResponse response) throws IllegalStateException, IOException {
            StringBuilder result = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())), 1024);
            String output;
            while ((output = br.readLine()) != null) 
                result.append(output);

            return result;      
      }
}

然后在Android类中,您可以:

Client client = new Client("http://localhost:6577/Example/rest/");
String str = client.getBaseURI("Example");    // Json format

解析JSON字符串(或者可能是xml)并在ListView,GridView和…中使用它

我简要介绍了你提供的链接.那里有一个好点.您需要在API级别11或更高级别的单独线程上实现网络连接.看看这个链接:HTTP Client API level 11 or greater in Android.

这是我在Client类中使用HTTP发布对象的方式:

public String postBaseURI(String str, String strUrl) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            httpconnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            httpconnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost postRequest = new HttpPost(getBase() + strUrl);
            StringEntity input = new StringEntity(str);
            input.setContentType("application/json");
            postRequest.setEntity(input);
            HttpResponse response = httpClient.execute(postRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

在REST WS中,我将对象发布到数据库:

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public Response addTask(Task task) {        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(task);
        session.getTransaction().commit();
        return Response.status(Response.Status.CREATED).build();
    }

C++上传文件到Restful Web Service服务端——客户端篇

C++上传文件到Restful Web Service服务端——客户端篇

由于项目的需要,要做一个C++的http请求客户端实现上传数据到服务端的功能,服务端用的是Spring MVC实现的Restful Web Service,起初设计时在服务端以byte[]的形式接受数据,毕竟服务端用java写的,把接收到的数据流解析成相应的文件这是完全可行的。

    如果写过Java或者其他语言的Http请求的人都知道,请求方式可以分GET和POST两种,不过GET传递的数据充其量只是简单类型的参数而已,在请求时的数据格式如代码,这是请求http://www.ip138.com:8080/search.asp?mobile=1565888&action=mobile站点的请求参数:

GET /search.asp?mobile=1565888&action=mobile HTTP/1.1
Host: www.ip138.com:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

以上是用FireFox的插件Live Http Headers获取的数据,而且这个插件可以自行编辑参数定制HTTP请求,方便编程的测试工作,具体使用可以查阅资料。这里面好多参数并不是必须的,但是为了模拟浏览器的效果最好设置一下。另外对于GET请求不需要设置Content-Type和Content-Length参数,通常这两个也是成对出现的。User-Agent表示请求客户端的浏览器和OS信息,这里模拟浏览器访问可以自己定制。

    POST请求的数据是放在请求体里的,具体信息可参考http://blog.csdn.net/yc0188/article/details/4741871,严格按照要求组织请求数据即可。注意请求头和请求数据之间的空行。这是一个Web系统的POST请求数据:

POST /myproject/infoUpdate HTTP/1.1
Host: 192.168.52.250:8088
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://192.168.52.250:8088/myproject/infoUpdate.action
Content-Type: application/x-www-form-urlencoded
Content-Length: 24

infoId=3&currentPage=1

另外在具体组织请求信息时,Windows下是用\r\n作为换行符的,但是在linux下这样用也不错,虽然linux的换行符是\n。

strcat(requestStr, "POST ");
strcat(requestStr, api);
strcat(requestStr, " HTTP/1.1\r\n");
strcat(requestStr, "Accept: application/x-ms-application, image/gif, "
	"application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, "
	"application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n");
strcat(requestStr, "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/17.0 Firefox/17.0\r\n");
strcat(requestStr, "Accept-Language: zh-CN,en-US;q=0.5\r\n");
strcat(requestStr, "Accept-Encoding: gzip, deflate\r\n");
strcat(requestStr, "Host: ");
strcat(requestStr, hostname);
strcat(requestStr, "\r\n");

    POST简单的数据以上就可以做到,但是对于上传文件呢。文件通常是二进制形式的,也就是要传输流。不过我们对struts2或者Spring MVC的上传文件表单不陌生,于是我监测了一个上传文件操作的请求数据:

POST /myproject/infoUpdate HTTP/1.1
Host: 192.168.52.250:8088
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Content-Length: 95254

-----------------------------41184676334\r\n
Content-Disposition: form-data; name="id"\r\n
\r\n
6\r\n
-----------------------------41184676334\r\n
Content-Disposition: form-data; name="doc"; filename="faq_info.jpg"\r\n
Content-Type: image/jpeg\r\n
\r\n
……请求的数据流……
\r\n-----------------------------41184676334--\r\n

这里用到了boundary(分隔符),用来间隔不同的请求数据,这是Content-Type类型为multipart/form-data(Spring MVC Restful Web Service也支持multipart/mixed的类型用于上传文件)时所要求的数据格式,和Content-Type为application/x-www-form-urlencoded时用&间隔参数是一样的。但是要注意使用的规则,可参见http://blog.csdn.net/mspinyin/article/details/6141638。Java版本的HttpURLConnection请求可参考:http://lapulande.iteye.com/blog/719581。C++版的可以用Windows下的winsock,代码可参考:http://www.cnblogs.com/evlon/archive/2007/08/13/853145.htmlhttp://www.oschina.net/code/snippet_176076_5908分别是windows下的和linux的范例,上述链接代码只是使用socket完成了请求操作,并没有做上传数据的部分。我建议用到的朋友可以先用Java版的客户端进行上传文件测试,如果测试通过了,可以比照着写C++的代码,在请求头部分C++老老实实地组织对应的参数就可以,请求数据部分要严格注意换行的地方,以及上传文件的长度加入Content-Length(包括上传数据长度和分隔符等其他字符的长度)。

    文件流的长度可以这样获得:

ifstream fin(filePath ,ios::in|ios::binary);
  if(!fin){
    cout<<"File open error!\n";
    return -1;
  }
  //---get the length of the file
  int temp = fin.tellg();
  fin.seekg(0,ios_base::end);
  int len = fin.tellg();
  fin.seekg(temp);

获得长度后重新定位到文件开始处。

    上传文件流时要读取多少send多少,否则服务端得到的是错误的流,且在send时不要用strlen(c)来指定发送的长度,因为char* c中可能包含‘\0’这样的空字符,从而使用了错误的长度。

  char c[1024];
  memset(c, 0,1024);
  int tmpLen=0;
  int i=0;
  while(!fin.eof())
  {
	if(tmpLen<(len/1024)*1024) //首先按照1024的单位传
	{
		fin.read(c, 1024);
		send(sock,c,1024,0);
		Sleep(1); //休息,为了降低CPU使用率以及照顾带宽
		tmpLen+=1024;
	}else //如果剩余的小于等于1024了,单独send剩余的字节
	{
		fin.read(c,len-(len/1024)*1024);
		send(sock,c,len-(len/1024)*1024,0);
		break;
	}
  }
  fin.close();

    在C++里用socket建立的请求,没有使用HTTP协议,可以选择TCP或者UDP协议,默认用TCP。我在测试中使用WireShark监测传输的数据时,在HTTP相关协议中没有看到数据,原因就在于此,Java版请求的就可以检测到。

CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)

CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)

上次介绍了使用CXF框架开发SOAP WebService服务,接下来介绍如何使用CXF框架开发RESTful风格的WebService服务.

这里就不罗嗦介绍restful是什么云云的话了(因为我也不理解..),或者说官方的话读起来觉得隐晦难懂,REST -- REpresentational State Transfer 直接翻译:表现层状态转移(这偷猫的谁能懂???),所以呢,我觉得就是一句话:用URL定位资源,用HTTP来描述CRUD操作.

所以必须知道一下几点:

1.服务端每一个对象,每一个资源都可以通过唯一的URL来进行寻址.

2.基于HTTP协议来进行资源请求{GET(查),POST(增),PUT(改),DELETE(删)}.或许这就是REST的奥妙所在吧.

3.访问的每一个资源都可以使用不同的形式加以表示(XML/JSON).

CXF框架支持RESTful风格的编程,发布了JAX-RS规范(http://cxf.apache.org/docs/jax-rs.html).

======================================================================================================================================好了,如何发布一个REST服务并调用呢?

服务端(Spring继承JPA与数据库交互):

1.实体类(加上@XmlRootElement注解,方便对象与XML之间转换)

@XmlRootElement
@Entity
public class User {
	private Integer uno;
	private String uname;
}
2.定义一个REST服务接口

public interface IUserService {
	@GET//请求的方法
	@Path("sayHi")//方法的路径名(独一无二)
	String sayHi(@QueryParam("name") String name);
	@GET
	@Path("queryById")
	@Produces(MediaType.APPLICATION_JSON)//输出数据的格式
	@Consumes(MediaType.APPLICATION_JSON)//接受数据的格式
	User queryById(@QueryParam("uno") Integer uno);//方法中的查询参数,注意与@PathParam的区别,前者是键值对的形式出现的,本人喜欢用前者.
	@GET
	@Path("queryAll")
	@Produces(MediaType.APPLICATION_JSON)
	List<User> queryAll();
	@POST
	@Path("addUser")
	@Consumes(MediaType.APPLICATION_JSON)
	void addUser(User user);
	@PUT
	@Path("updUser")
	@Consumes(MediaType.APPLICATION_JSON)
	void updUser(User user);
	@DELETE
	@Path("delUser")
	@Consumes(MediaType.APPLICATION_JSON)
	void delUser(@QueryParam("uno") Integer uno);
}
3.实现接口(其实rest不要求一定要有接口,所以可以直接实现方法)的部分省略,我是利用jpaRepository提供的方法实现的,有兴趣可以参照之前的博客.

@Component
public class UserServiceImpl implements IUserService{
......
}


4.发布REST服务(与Spring结合)

spring-cxf.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxrs
    http://cxf.apache.org/schemas/jaxrs.xsd">
    
    <jaxrs:server address="/user">
        <jaxrs:serviceBeans>
            <ref bean="userServiceImpl"/>
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <beanhttps://www.jb51.cc/tag/njs/" target="_blank">njsonProvider"/>
        </jaxrs:providers>
    </jaxrs:server>
    
</beans>

web.xml:

    <!-- Spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- CXF -->
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>

客户端(JAXRS2.0+WebClient两种方式实现CRUD):

1.JAXRS2.0(推荐使用)

//使用JAXRS2.0发布REST服务
public class JAXRSClientTest {
	private static final String url = "http://localhost:8080/restfulServer/ws/user";
	private static final JacksonjsonProvider jsonProvider = new JacksonjsonProvider();
    @Test
    public void sayHitest() {
        String result = ClientBuilder.newClient()
    		.target(url).path("/sayHi").queryParam("name","呢喃北上")
            .request().get(String.class);
        System.out.println(result);
    }
    @Test
    public void queryByIdtest() {
    	 System.out.println("根据id查询用户");  
         Client client = ClientBuilder.newClient().register(jsonProvider);// 注册json 支持  
         WebTarget target = client.target(url + "/queryById").queryParam("uno",2);  
         Invocation.Builder builder = target.request();
         Response response = builder.get();  
         User user = response.readEntity(User.class);  
         System.out.println(user.getUname());  
         response.close();  
     	 System.out.println("over");
    }
    @Test
    public void queryAlltest(){
		System.out.println("查询所有的用户");		
		List<User> users = ClientBuilder.newClient().register(jsonProvider)
			    .target(url).path("/queryAll")
			    .request().get(new GenericType<List<User>>() {});
		for (User user : users) {
		    System.out.println(user);
		}
		System.out.println("over");
    }
    @Test
    public void addUsertest(){
    	System.out.println("增加一位用户");
    	User user = new User(0,"mokeychan");
    	Client client = ClientBuilder.newClient().register(jsonProvider);
    	WebTarget target = client.target(url+"/addUser");
    	Response response = target.request().buildPost(Entity.entity(user,MediaType.APPLICATION_JSON)).invoke();
    	response.close();
    	System.out.println("over");
    }
    @Test
    public void updUsertest(){
    	System.out.println("更新一名用户");
    	User user = new User(21,"雷蒙磨咯");
    	Client client = ClientBuilder.newClient().register(jsonProvider);
    	WebTarget target = client.target(url+"/updUser");
    	Response response = target.request().buildPut(Entity.entity(user,MediaType.APPLICATION_JSON)).invoke();
    	response.close();
    	queryAlltest();
    	System.out.println("over");;
    }
    @Test
    public void delUser(){
    	System.out.println("删除一名用户");
    	Client client = ClientBuilder.newClient().register(jsonProvider);
    	WebTarget target = client.target(url+"/delUser?uno=18");
    	Response response = target.request().delete();
    	response.close();
    	System.out.println("over");
    }
}
2.WebClient实现

//通用的WebClient方式发布
public class WebClientTest {
	private static final String url = "http://localhost:8080/restfulServer/ws/user";
	public static void main(String[] args) {
		List<Object> providerList = new ArrayList<Object>();
        providerList.add(new JacksonjsonProvider());
		WebClient client = WebClient.create(url,providerList);
		User user = client.path("/queryById").query("uno",2).accept(MediaType.APPLICATION_JSON).get(User.class);
		System.out.println(user.toString());
		/*List users = client.path("/queryAll").accept(MediaType.APPLICATION_JSON).get(List.class);
		for (Object user : users) {
			System.out.println(user.toString());
		}*/
	}
}
好了,发布与调用RESTful风格的WebService服务就实现了,不得不说利用URL来访问资源真的是妙啊.

感谢黄勇大神的启发博文,链接:https://my.oschina.net/huangyong/blog/294324

项目参考地址:http://download.csdn.net/download/qq_33764491/10180087

今天关于Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件golang 发送http请求的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net 从WebService的restful api接口以POST方式请求并获取返回值、android – Java jersey RESTful webservice请求、C++上传文件到Restful Web Service服务端——客户端篇、CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)的相关知识,请在本站搜索。

本文标签: