当前位置: 代码迷 >> Android >> 使用HTTP协议的POST方式有有关问题
  详细解决方案

使用HTTP协议的POST方式有有关问题

热度:71   发布时间:2016-04-28 02:26:18.0
使用HTTP协议的POST方式有问题!
先上我的Android端的业务逻辑层的代码:
package spt.http.post.assist;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import android.os.Handler;
import android.util.Log;

/**
 * 用户向服务器端发送数据的类(使用post)方法.
 * 
 * @author Administrator
 * 
 */
public class SendDataToServer {
private static final int TIME_OUT = 10000; // 超时时间.
// 连接服务器的url.
private static final String URL = "http://192.168.1.101:8080/ReceiveAndroid/ServletForPostMethod";
// 标识是否连接到服务器成功.
public static final int SEND_SUCCESS = 1;
public static final int SEND_FAIL = 0;

private Handler handler = null;

public SendDataToServer(Handler handler) {
this.handler = handler;
}

/**
 * 往服务器发送数据.
 * 
 * @param name
 * @param pwd
 */
public void send(String name, String pwd) {
// 这里params要传递到另外一个方法,加final为了防止被修改.
final Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("pwd", pwd);

// 启动新的线程连接服务器.
new Thread(new Runnable() {

@Override
public void run() {
// 请求连接.
try {
if (postSend(params, URL, "utf-8"))
handler.sendEmptyMessage(SEND_SUCCESS);
else
handler.sendEmptyMessage(SEND_FAIL);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}

/**
 * 发送post请求的方法.
 * 
 * @param params
 *            请求参数的键-值对.
 * @param url
 * @param encoding
 *            使用指定编码对参数值进行编码.
 * @return
 * @throws MalformedURLException
 * @throws IOException
 */
private boolean postSend(Map<String, String> params, String url,
String encoding) throws MalformedURLException, IOException {
StringBuilder sb = new StringBuilder();
// 向url中添加参数.
sb.append(url).append("?");
for (Entry<String, String> param : params.entrySet()) {
sb.append(param.getKey()).append("=")
.append(URLEncoder.encode(param.getValue(), encoding))
.append("&");
}
if (params.size() > 0)
sb.deleteCharAt(sb.length() - 1); // 去掉末尾的'&'.
HttpURLConnection conn = (HttpURLConnection) new URL(sb.toString())
.openConnection();
byte[] data = sb.toString().getBytes();
conn.setConnectTimeout(TIME_OUT);
conn.setRequestMethod("GET"); // POST是大小写敏感的.
conn.setDoOutput(true);
conn.setRequestProperty("Content-Length", data.length + "");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 设置窗体数据编码为名称/值对
Log.d("sysout", "url:" + sb);
Log.d("sysout", "获取输出流前");
OutputStream writer = conn.getOutputStream();
Log.d("sysout", "获取输出流后");
writer.write(data);
writer.flush();
return conn.getResponseCode() == 200; // 等于200表示发送成功.
}
}



在postSend方法中, 程序在 ' OutputStream writer = conn.getOutputStream();' 这行的时候就有问题了,使用log不执行 '获取输出流后' 这行.
当然, 在 服务器端的 Servlet中的post方法都进入不了.
之前用GET方式是没有问题的, 代码只是稍改.
总之,我觉得在客户端那行代码都获取不了输出流. 怎么办?大神们.
------解决思路----------------------
你这不是写的GET么。。。
------解决思路----------------------

Post List<NameValuePair>好像要这样封装所传的参数!
------解决思路----------------------
楼上对头,post要做数据封装的
  相关解决方案