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

简介:

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

   原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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头信息,最终发送数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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,  0 , 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, parameters, 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,
             Map<String, String> parameters, String fileParamName,
             String filename, String contentType,  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,  0 , i);
             in.close();
             return  os.toByteArray();
         catch  (Exception e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
     }
}

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










本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1412977,如需转载请自行联系原作者
目录
相关文章
|
26天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
195 14
|
2月前
|
XML Java Maven
WebService客户端调用的5种常见方式
本文介绍了在Java中创建和调用WebService的方法,包括服务端的搭建、配置类的添加以及客户端的多种调用方式(如使用JDK原生代码、wsimport命令、动态调用、代理工厂及HttpClient)。文中详细展示了每种方法的实现步骤和示例代码,强调了服务端与客户端参数实体类字段的兼容性,并推荐使用代理工厂方式进行调用。
253 0
WebService客户端调用的5种常见方式
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
5月前
|
监控 测试技术 API
|
5月前
|
JSON 监控 应用服务中间件
[golang]使用tail追踪文件变更
[golang]使用tail追踪文件变更
|
5月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
142 0
|
6月前
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
134 0
|
8月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
8月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
8月前
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
493 2