客户端发送请求代码片段:
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;、
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
public Map HttpPost(String url, Map parameter) {
try {
org.apache.http.client.HttpClient httpClient = null;
if (StringUtils.isBlank(url)) {
throw new RuntimeException("url为空!");
}
if (url.trim().startsWith("https")) {
httpClient = getHttpsClient(new DefaultHttpClient());
} else {
httpClient = new DefaultHttpClient();
}
HttpResponse httpResponse = null;
HttpPost httpPost = new HttpPost(url);
//标准的表单提交
List list = new ArrayList();
list.add(new BasicNameValuePair("key1", parameter.get("key1")));
list.add(new BasicNameValuePair("key2", parameter.get("key2")));
list.add(new BasicNameValuePair("requestData", parameter.get("requestData")));
httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
//判断是否使用代理
if ("YES".equals(isProxy)) {
int mid = proxyHost.indexOf("|");
String proxyHostStr1 = "";
String proxyHostStr2 = "";
if (mid == -1) {
proxyHostStr1 = proxyHost;
} else {
proxyHostStr1 = proxyHost.substring(0, mid);
proxyHostStr2 = proxyHost.substring(mid + 1);
}
try {
HttpHost proxy = new HttpHost(proxyHostStr1, proxyPort);
httpClient.getParams().setParameter(
"http.route.default-proxy", proxy);
httpResponse = httpClient.execute(httpPost);
} catch (Exception e) {
HttpHost proxy = new HttpHost(proxyHostStr2, proxyPort);
httpClient.getParams().setParameter(
"http.route.default-proxy", proxy);
httpResponse = httpClient.execute(httpPost);
}
} else {
httpResponse = httpClient.execute(httpPost);
}
HttpEntity returnEntity = httpResponse.getEntity();
if (returnEntity != null) {
String resStr = EntityUtils.toString(returnEntity, responseCharSet);
return JacksonUtils.getMapFromJson(resStr);
}
} catch (Exception e) {
Log.error("服务调用时出现异常", e);
}
return null;
}
private org.apache.http.client.HttpClient getHttpsClient(
org.apache.http.client.HttpClient httpclient) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
httpclient.getConnectionManager().getSchemeRegistry()
.register(new Scheme("https", 443, sslSocketFactory));
return httpclient;
}
服务端接受请求代码(采用原始servlet方式接受)
protected void doPost(HttpServletRequest request,
HttpServletResponse response) {
String serviceName = (String) request.getParameter("key的名称");
String responseJson = null;
/**
* 中间去做一些业务处理,把结果赋值给responseJson
*/
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(responseJson);
out.flush();
out.close();
}
上面的客户端和服务端通过的是 标准的表单提交的方式。这种方式才可以使用request.getParameter(“key的名称”)获取到值。
之前犯得错误是发送表单数据使用的是
StringEntity stringEntity=new StringEntity(request,requestCharSet);
httpPost.setEntity(stringEntity);
设置的表单数据,这种方式在服务端通过request.getParameter(“key的名称”)是根本获取不到数据的。这种方式发送的是个消息体,而且消息体是个字符串,不是表单的key:value 格式的,所以获取不到数据。这种方式发送的数据应该使用@RequestBody或者让springmvc给你自动组装成参数 的方式去接受。
总结:request.getParameter(“key的名称”) 这种方式获取数据必须是标准的表单提交 方式才可以取到值。(注: application/x-www-form-urlencoded )
enctype=”application/x-www-form-urlencoded”是默认的编码方式,当以这种方式提交数据时Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。