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月前
|
Java 网络架构 Spring
springboot中restful风格请求的使用
本文介绍了在Spring Boot中如何使用RESTful风格的请求,包括创建HTML表单页面、在application.yaml配置文件中开启REST表单支持、编写Controller层及对应映射处理,并进行服务启动和访问测试。HTML表单默认只支持GET和POST请求,因此对于DELETE和PUT请求,需要使用隐藏域`_method`来支持。
springboot中restful风格请求的使用
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
存储 物联网 测试技术
Golang中的HTTP请求凝聚器
Golang中的HTTP请求凝聚器
|
3月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
|
4月前
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
39 0
|
4月前
|
JSON 数据格式
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
|
6月前
|
Go
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
116 4
|
6月前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
73 1
|
14天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
31 4