我一直在尝试从 SO 和其他网站上的大量示例中学习,但我无法弄清楚为什么我一起破解的示例不起作用。我正在构建一个小型概念验证应用程序,它可以识别语音并将其(文本)作为 POST 请求发送到 node.js 服务器。我已经确认语音识别可以正常工作,并且服务器正在接收来自常规浏览器访问的连接,所以我相信问题出在应用程序本身。我错过了一些小而愚蠢的东西吗?没有抛出错误,但服务器永远不会识别连接。提前感谢您的任何建议或帮助。
相关Java(主要 Activity 和必要的AsyncTask):
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1001) {
if (resultCode == RESULT_OK) {
ArrayList<String> textMatchList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (!textMatchList.isEmpty()) {
String topMatch = textMatchList.get(0);
PostTask pt = new PostTask();
pt.execute(topMatch);
}
}
}
}
private class PostTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... data) {
try {
URL url = new URL("http://<ip address>:3000");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
ContentValues values = new ContentValues();
values.put("data", data[0]);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
StringBuilder sb = new StringBuilder();
sb.append(URLEncoder.encode("data", "UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(data[0], "UTF-8"));
writer.write(sb.toString());
writer.flush();
writer.close();
os.close();
conn.connect();
return "Text sent: " + data[0];
} catch (IOException e) {
e.printStackTrace();
return "LOL NOPE";
}
}
}
服务器 JS:
var http = require('http');
const PORT=3000;
function handleRequest(request, response){
response.end('It Works!! Path Hit: ' + request.url);
console.log("Request got.");
}
var server = http.createServer(handleRequest);
server.listen(PORT, '0.0.0.0');
console.log("Listening on 3000...");
最佳答案
您可以使用 Apache Commons 的 Http 客户端。例如:
private class PostTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... data) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://<ip address>:3000");
try {
//add data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("data", data[0]));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//execute http post
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
}
}
更新
您可以使用 Volley Android 网络库发布您的数据。官方文档是here .
我个人使用Android Asynchronous Http Client对于少数 REST 客户端项目。
其他值得探索的工具是Retrofit .
关于java - 使用 Android 发送 HTTP Post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31552242/