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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
3月前
|
存储 物联网 测试技术
Golang中的HTTP请求凝聚器
Golang中的HTTP请求凝聚器
|
3月前
|
监控 测试技术 API
|
3月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
106 0
|
4月前
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
71 0
|
6月前
|
Go
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
123 4
|
6月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
6月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
6月前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
79 1
|
6月前
|
Go 开发者
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
79 1