天天看点

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

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

<code>package</code> <code>main</code>

<code>                        </code> 

<code>//http://liuxp0827.blog.51cto.com/5013343/1412977                                                                                         </code>

<code>                      </code> 

<code>import</code> <code>(</code>

<code>    </code><code>"bufio"</code>

<code>    </code><code>"github.com/go-martini/martini"</code>

<code>    </code><code>"io/ioutil"</code>

<code>    </code><code>"log"</code>

<code>    </code><code>"net/http"</code>

<code>    </code><code>"os"</code>

<code>)</code>

<code>                                                                                                                                                                                                  </code> 

<code>func main() {</code>

<code>    </code><code>m := martini.Classic()</code>

<code>    </code><code>m.Post(</code><code>"/wave"</code><code>, func(req *http.Request) {</code>

<code>        </code><code>file, _, err := req.FormFile(</code><code>"file"</code><code>)</code>

<code>        </code><code>if</code> <code>err != nil {</code>

<code>            </code><code>log.Fatal(</code><code>"FormFile: "</code><code>, err.Error())</code>

<code>            </code><code>os.Exit(</code><code>2</code><code>)</code>

<code>        </code><code>}</code>

<code>        </code><code>defer func() {</code>

<code>            </code><code>if</code> <code>err := file.Close(); err != nil {</code>

<code>                </code><code>log.Fatal(</code><code>"Close: "</code><code>, err.Error())</code>

<code>                </code><code>os.Exit(</code><code>2</code><code>)</code>

<code>            </code><code>}</code>

<code>        </code><code>}()</code>

<code>        </code><code>localFile, _ := os.Create(</code><code>"1.wav"</code><code>)</code>

<code>        </code><code>defer localFile.Close()</code>

<code>        </code><code>writer := bufio.NewWriter(localFile)</code>

<code>        </code><code>bytes, err := ioutil.ReadAll(file)</code>

<code>            </code><code>log.Fatal(</code><code>"ReadAll: "</code><code>, err.Error())</code>

<code>        </code><code>writer.Write(bytes)</code>

<code>        </code><code>writer.Flush()</code>

<code>    </code><code>})</code>

<code>    </code><code>http.ListenAndServe(</code><code>":8080"</code><code>, m)</code>

<code>}</code>

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

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

<code>import</code> <code>java.io.ByteArrayOutputStream;</code>

<code>import</code> <code>java.io.File;</code>

<code>import</code> <code>java.io.FileInputStream;</code>

<code>import</code> <code>java.io.FileNotFoundException;</code>

<code>import</code> <code>java.io.IOException;</code>

<code>import</code> <code>java.io.InputStream;</code>

<code>import</code> <code>java.io.OutputStream;</code>

<code>import</code> <code>java.net.HttpURLConnection;</code>

<code>import</code> <code>java.net.URL;</code>

<code>import</code> <code>java.util.HashMap;</code>

<code>import</code> <code>java.util.Iterator;</code>

<code>import</code> <code>java.util.Map;</code>

<code>                                                                                         </code> 

<code>                    </code> 

<code>//http://liuxp0827.blog.51cto.com/5013343/1412977</code>

<code>                                                              </code> 

<code>public</code> <code>final</code> <code>class</code> <code>upload {</code>

<code>                                                                                                                                  </code> 

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code><code>Map&lt;String, String&gt; parameters = </code><code>new</code> <code>HashMap&lt;String, String&gt;();                                                                </code>

<code>        </code><code>byte</code><code>[] data = readWavform(</code><code>"C:\\Users\\PONPON\\Desktop\\test.wav"</code><code>);</code>

<code>        </code><code>doUploadFile(</code><code>"http://localhost:8080/wave"</code><code>, parameters,</code>

<code>                </code><code>Constants.FILEPARAM, </code><code>"11.wav"</code><code>, </code><code>"multipart/form-data;"</code><code>,</code>

<code>                </code><code>data);</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>static</code> <code>byte</code><code>[] readWavform(String filename) {</code>

<code>        </code><code>int</code> <code>regLen = </code><code>0</code><code>;</code>

<code>        </code><code>byte</code><code>[] regbuffer = </code><code>null</code><code>;</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>FileInputStream inputsteam = </code><code>new</code> <code>FileInputStream(</code><code>new</code> <code>File(filename));</code>

<code>            </code><code>regLen = inputsteam.available();</code>

<code>            </code><code>regbuffer = </code><code>new</code> <code>byte</code><code>[regLen];</code>

<code>            </code><code>if</code> <code>((regLen = inputsteam.read(regbuffer, </code><code>0</code><code>, regLen)) &lt; </code><code>0</code><code>) {</code>

<code>                </code><code>System.out.println(</code><code>"error when read pcm file."</code><code>);</code>

<code>        </code><code>} </code><code>catch</code> <code>(FileNotFoundException e) {</code>

<code>            </code><code>// TODO Auto-generated catch block</code>

<code>            </code><code>e.printStackTrace();</code>

<code>        </code><code>} </code><code>catch</code> <code>(IOException e) {</code>

<code>        </code><code>return</code> <code>regbuffer;</code>

<code>    </code><code>public</code> <code>static</code> <code>String doUploadFile(String reqUrl,</code>

<code>            </code><code>Map&lt;String, String&gt; parameters, String fileParamName,</code>

<code>            </code><code>String filename, String contentType, </code><code>byte</code><code>[] data) {</code>

<code>        </code><code>HttpURLConnection urlConn = </code><code>null</code><code>;</code>

<code>            </code><code>urlConn = sendFormdata(reqUrl, parameters, fileParamName, filename,</code>

<code>                    </code><code>contentType, data);</code>

<code>            </code><code>String responseContent = </code><code>new</code> <code>String(getBytes(urlConn));</code>

<code>            </code><code>return</code> <code>responseContent.trim();</code>

<code>        </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>            </code><code>throw</code> <code>new</code> <code>RuntimeException(e.getMessage(), e);</code>

<code>        </code><code>} </code><code>finally</code> <code>{</code>

<code>            </code><code>if</code> <code>(urlConn != </code><code>null</code><code>) {</code>

<code>                </code><code>urlConn.disconnect();</code>

<code>    </code><code>private</code> <code>static</code> <code>HttpURLConnection sendFormdata(String reqUrl,</code>

<code>            </code><code>URL url = </code><code>new</code> <code>URL(reqUrl);</code>

<code>            </code><code>urlConn = (HttpURLConnection) url.openConnection();</code>

<code>            </code><code>urlConn.setRequestMethod(</code><code>"POST"</code><code>);</code>

<code>            </code><code>urlConn.setConnectTimeout(</code><code>10000</code><code>);</code><code>// (单位:毫秒)jdk</code>

<code>            </code><code>urlConn.setReadTimeout(</code><code>10000</code><code>);</code><code>// (单位:毫秒)jdk 1.5换成这个,读操作超时</code>

<code>            </code><code>urlConn.setDoOutput(</code><code>true</code><code>);</code>

<code>            </code><code>urlConn.setRequestProperty(</code><code>"connection"</code><code>, </code><code>"keep-alive"</code><code>);</code>

<code>            </code><code>String boundary = </code><code>"-----------------------------114975832116442893661388290519"</code><code>; </code><code>// 分隔符</code>

<code>            </code><code>urlConn.setRequestProperty(</code><code>"Content-Type"</code><code>,</code>

<code>                    </code><code>"multipart/form-data; boundary="</code> <code>+ boundary);</code>

<code>            </code><code>boundary = </code><code>"--"</code> <code>+ boundary;</code>

<code>            </code><code>StringBuffer params = </code><code>new</code> <code>StringBuffer();</code>

<code>            </code><code>if</code> <code>(parameters != </code><code>null</code><code>) {</code>

<code>                </code><code>for</code> <code>(Iterator&lt;String&gt; iter = parameters.keySet().iterator(); iter</code>

<code>                        </code><code>.hasNext();) {</code>

<code>                    </code><code>String name = iter.next();</code>

<code>                    </code><code>String value = parameters.get(name);</code>

<code>                    </code><code>params.append(boundary + </code><code>"\r\n"</code><code>);</code>

<code>                    </code><code>params.append(</code><code>"Content-Disposition: form-data; name=\""</code>

<code>                            </code><code>+ name + </code><code>"\"\r\n\r\n"</code><code>);</code>

<code>                    </code><code>params.append(value);</code>

<code>                    </code><code>params.append(</code><code>"\r\n"</code><code>);</code>

<code>                </code><code>}</code>

<code>            </code><code>StringBuilder sb = </code><code>new</code> <code>StringBuilder();</code>

<code>            </code><code>sb.append(boundary);</code>

<code>            </code><code>sb.append(</code><code>"\r\n"</code><code>);</code>

<code>            </code><code>sb.append(</code><code>"Content-Disposition: form-data; name=\""</code> <code>+ fileParamName</code>

<code>                    </code><code>+ </code><code>"\"; filename=\""</code> <code>+ filename + </code><code>"\"\r\n"</code><code>);</code>

<code>            </code><code>sb.append(</code><code>"Content-Type: "</code> <code>+ contentType + </code><code>"\r\n\r\n"</code><code>);</code>

<code>            </code><code>byte</code><code>[] fileDiv = sb.toString().getBytes(</code><code>"UTF-8"</code><code>);</code>

<code>            </code><code>byte</code><code>[] endData = (</code><code>"\r\n"</code> <code>+ boundary + </code><code>"--\r\n"</code><code>).getBytes(</code><code>"UTF-8"</code><code>);</code>

<code>            </code><code>byte</code><code>[] ps = params.toString().getBytes(</code><code>"UTF-8"</code><code>);</code>

<code>            </code><code>OutputStream os = urlConn.getOutputStream();</code>

<code>            </code><code>os.write(ps);</code>

<code>            </code><code>os.write(fileDiv);</code>

<code>            </code><code>os.write(data);</code>

<code>            </code><code>os.write(endData);</code>

<code>            </code><code>os.flush();</code>

<code>            </code><code>os.close();</code>

<code>        </code><code>return</code> <code>urlConn;</code>

<code>    </code><code>private</code> <code>static</code> <code>byte</code><code>[] getBytes(HttpURLConnection urlConn) {</code>

<code>            </code><code>InputStream in = urlConn.getInputStream();</code>

<code>            </code><code>ByteArrayOutputStream os = </code><code>new</code> <code>ByteArrayOutputStream();</code>

<code>            </code><code>byte</code><code>[] buf = </code><code>new</code> <code>byte</code><code>[</code><code>1024</code><code>];</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; (i = in.read(buf)) &gt; </code><code>0</code><code>;)</code>

<code>                </code><code>os.write(buf, </code><code>0</code><code>, i);</code>

<code>            </code><code>in.close();</code>

<code>            </code><code>return</code> <code>os.toByteArray();</code>

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

本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1412977,如需转载请自行联系原作者