java调http接口 post方式请求 服务器识别全是乱码 服务器识别utf-8的内容 哪位大神知道怎么解决吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调http接口 post方式请求 服务器识别全是乱码 服务器识别utf-8的内容 哪位大神知道怎么解决吗?相关的知识,希望对你有一定的参考价值。

看下你post的方法,设置下这个

httpURLConnection.setRequestProperty("Charset", "utf-8");

拼接参数时:转一下格式

URLEncoder.encode(String.valueOf(value), "utf-8")


下面是我使用的POST方法,最简单的一种

Map<String, String> params = new HashMap<>(); //参数

HttpURLConnection urlCon = null;
URL urlInstance;
StringBuilder sbResult = new StringBuilder();
try 
urlInstance = new URL(url);
urlCon = (HttpURLConnection) urlInstance.openConnection();
urlCon.setRequestMethod("POST");

urlCon.setDoOutput(true); // 是否可以发送数据到服务器
urlCon.setDoInput(true); // 设置是否读服务端
urlCon.setUseCaches(false); // 设置是否缓存
urlCon.setConnectTimeout(15000);// 设置响应超时
// 固定格式
urlCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlCon.setRequestProperty("Charset", "utf-8");

// 对参数进行处理
String data = "";
if (params != null) 
String value;
Set<String> set = params.keySet();// 获取到所有map的键
for (String string : set) // 遍历参数,拼接data
value = params.get(string);
data += string + "=" + URLEncoder.encode(String.valueOf(value), "utf-8") + "&";



urlCon.setRequestProperty("Content-Length", String.valueOf(data.length())); // 设置长度

// 往服务器写入数据
OutputStream out = urlCon.getOutputStream();
out.write(data.getBytes());
out.flush();

// 接收服务器返回的数据
InputStream in = urlCon.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String line;// 每一行的数据
while ((line = br.readLine()) != null) 
sbResult.append(line);

参考技术A /**
 * POST方式请求
 * 
 * @param uri
 *            服务器的uri要用物理IP或域名,不识别localhost或127.0.0.1形式!
 * @param paramMap
 * @param headers
 * @return
 * @throws ClientProtocolException
 * @throws IOException
 */
public static String post(String uri, Map<String, String> paramMap,
Map<String, String> headers) throws ClientProtocolException,
IOException 
HttpPost httpPost = new HttpPost(uri);
if (headers != null) 
for (String key : headers.keySet()) 
httpPost.setHeader(key, headers.get(key));


List<NameValuePair> params = new ArrayList<NameValuePair>();
if (paramMap != null) 
for (String key : paramMap.keySet()) 
params.add(new BasicNameValuePair(key, paramMap.get(key)));

              httpPost.setEntity(new ByteArrayEntity(paramMap.get("reqData").getBytes("UTF-8")));
// httpPost.setEntity(new UrlEncodedFormEntity(params,
// DEFAULT_ENCODING));

HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);
int statusCode;
if ((statusCode = httpResponse.getStatusLine().getStatusCode()) == 200) 
return EntityUtils.toString(httpResponse.getEntity());

throw new IOException("status is " + statusCode);


public static String post(String uri, String contentType, String content)
throws Exception 
org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();

PostMethod post = new PostMethod(uri);

RequestEntity entity = new StringRequestEntity(content, contentType,DEFAULT_ENCODING);
post.setRequestEntity(entity);

int statusCode = client.executeMethod(post);
if (statusCode == 200) 
return post.getResponseBodyAsString();

throw new IOException("status is " + statusCode);

你可以设置下他的默认传递代码方式:DEFAULT_ENCODING 为UTF-8

Nginx配置http强转https,参数丢失问题

参考技术A 在Nginx配置文件加上这个判断就,重启Nginx就可以了。

rewrite ^(/.*)$ https://$host/$1 permanent;这句命令可以使http强制跳转https,但是APP在使用post方式调http接口时,服务器自动将post请求改为get请求,参数丢失。return 307 https://$server_name$request_uri;命令可以使301转为307,这时APP调接口接可以正常使用了。不过有时候ios可以正常调用,但是Android调不起,就需要Android改配置了。

以上是关于java调http接口 post方式请求 服务器识别全是乱码 服务器识别utf-8的内容 哪位大神知道怎么解决吗?的主要内容,如果未能解决你的问题,请参考以下文章

Tornado之接口调用时方式执行顺序

SpringCloud Feign调用服务接口时,GET请求变成POST请求报错 _

Nginx配置http强转https,参数丢失问题

http请求POST和GET调用接口以及反射动态调用Webservices类

接口测试

Swift - POST 请求在服务器上识别为 GET