request.getParameter("key")获取不到值得原因

客户端发送请求代码片段:

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()方法就可以得到表单中提交的数据。

猜你喜欢

转载自blog.csdn.net/liuhaiquan123521/article/details/84635494