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,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
Go
golang力扣leetcode 1601.最多可达成的换楼请求数目
golang力扣leetcode 1601.最多可达成的换楼请求数目
37 0
|
6月前
|
NoSQL 安全 Go
Golang 官方推荐使用的 Redis 客户端 redigo
Golang 官方推荐使用的 Redis 客户端 redigo
120 0
|
7月前
|
JSON 网络协议 Go
golang使用resty库实现模拟请求正方教务
本文主要讲解了如何使用golang模拟请求正方教务
232 0
|
8月前
|
Java 测试技术 API
Java RESTful中的PATCH请求:局部更新与资源修改
在RESTful架构中,PATCH请求是一种用于局部更新已有资源的操作。PATCH请求允许客户端将部分数据发送到服务器,以便对资源进行局部修改,而不必替换整个资源。本文将引导您深入了解Java中使用PATCH请求构建RESTful API,探讨其特点、实现方式、用例以及在实际应用中的优势。
|
6月前
|
存储 JSON Go
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
74 0
|
6月前
|
消息中间件 自然语言处理 Go
Golang 语言编写的消息队列 NSQ 官方客户端 go-nsq 怎么使用?
Golang 语言编写的消息队列 NSQ 官方客户端 go-nsq 怎么使用?
50 0
|
6月前
|
Unix Go
Golang 语言的标准库 os 包怎么操作目录和文件?
Golang 语言的标准库 os 包怎么操作目录和文件?
27 0
|
6月前
|
消息中间件 Java Kafka
Golang 语言中 kafka 客户端库 sarama
Golang 语言中 kafka 客户端库 sarama
110 0
|
3月前
|
Go
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
81 0
|
3月前
|
Go
golang力扣leetcode 937.重新排列日志文件
golang力扣leetcode 937.重新排列日志文件
27 0