⑴ java https請求 中文亂碼問題
嘗試的方法:
1. 在服務端接收到參數時,utf-8轉gbk,無效。
2. 在服務端接收到參數時,iso-8859-1轉gbk,無效。
3. 在發送請求前將中文參數轉碼,utf-8轉iso-8859-1,無效。代碼如下:
new String(remark.getBytes(「UTF-8」), 「ISO-8859-1」)
4. 在請求端,HttpHeader設定ContentType為「application/json;UTF-8」,無效。代碼如下:
headers.setContentType(Media.valueOf(「application/json;UTF-8」));
寫到這里,有人應該感覺到這有點「病急亂投醫」的感覺了,沒有頭緒地在試著各種方式。是的,起初我覺得是請求header中採用了ISO-8859-1的編碼,但嘗試後很顯然不是;後來我覺著是否是RestTemplate中採用的HttpMessageConverter方式所決定的,但沒能找到很好的證明方式,查資料說的是StringHttpMessageConverter默認採用的是ISO-8859-1編碼,可我覺得我指定了ContentType為application/json,RestTemplate不應該去調用StringHttpMessageConverter啊,其中的原理還有待深究。個人感覺這種情況出問題的可能性最大。
最後,在網上看到一篇文章後,看了一種建議方式,並且是可行的,就是使用URLEncode,將中文參數在傳參前進行encode.這里以GBK編碼是為了在伺服器端接收參數後無需再轉碼了,如下:
list.add(URLEncode.encode(name, 「GBK」));
URLEncode方式可以解決這種特定場景的中文亂碼問題,相信理解其原理後還可以運用到更多的場景。目前我在網上看到的,關於用URLEncode處理中文亂碼最多的場景就是文件下載時中文文件名亂碼。
⑵ Java 修改編碼格式的幾種方式
主要分response的位元組字元輸出流和接受中文參數doGet(),doPost()的設置四種.以及從伺服器下載文件到瀏覽器的編碼問題.
都是我學習java時總結的,希望能幫到你.
response的位元組輸出流:
// 設置瀏覽器默認打開的時候採用的字元集編碼
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 設置中文轉成位元組數組的時候取出的編碼
response.getOutputStream().write("如果不設置編碼,這里就是亂碼".getBytes("UTF-8"));
response的字元輸出流:
//設置瀏覽器默認打開的時候採用的字元集編碼,response的字元流的緩沖區的編碼.
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("中文");
request的doGet()編碼解決:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("GET方式:"+name);
request的doPost()編碼解決:
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("POST方式:"+name);
下載文件時瀏覽器編碼問題:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收參數
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
System.out.println(filename);
// 2.完成文件下載:
// 2.1設置Content-Type頭(獲取文件的mime類型)
String type = this.getServletContext().getMimeType(filename);
//設置文件的mime類型
response.setHeader("Content-Type", type);
// 2.3web項目文件的絕對路徑
String realPath = this.getServletContext().getRealPath("/download/"+filename);
// 獲得瀏覽器的類型處理中文文件的亂碼問題.(User-Agent:伺服器收到客戶端版本之類的一些信息)
String agent = request.getHeader("User-Agent");
System.out.println(agent);
if(agent.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
//IE谷歌編碼
filename = URLEncoder.encode(filename,"UTF-8");
}
// 2.2設置Content-Disposition頭(固定寫法,讓瀏覽器必須下載,不能直接打開)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//獲得文件
InputStream is = new FileInputStream(realPath);
// 獲得response指定的方法獲取輸出流:如果用其他流是直接拷貝而不是下載
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!= -1){
os.write(b, 0, len);
}
//響應流可以不關,在伺服器做出相應後伺服器會自動把response獲得的流關閉
is.close();
}
//火狐
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
⑶ java post請求參數怎麼寫
//serverURL url地址
HttpPost httpPost = new HttpPost(serverURL);
//param 為參數
StringEntity entity = new StringEntity(param);
entity.setContentType("application/x-www-form-urlencoded");
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
還可以用map作為參數
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
if(param!=null){
Set set = param.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
Object value = param.get(key);
formparams.add(new BasicNameValuePair(key.toString(), value.toString()));
}
}
⑷ java調http介面 post方式請求 伺服器識別全是亂碼 伺服器識別utf-8的內容 哪位大神知道怎麼解決嗎
/**
*POST方式請求
*
*@paramuri
*伺服器的uri要用物理IP或域名,不識別localhost或127.0.0.1形式!
*@paramparamMap
*@paramheaders
*@return
*@throwsClientProtocolException
*@throwsIOException
*/
publicstaticStringpost(Stringuri,Map<String,String>paramMap,
Map<String,String>headers)throwsClientProtocolException,
IOException{
HttpPosthttpPost=newHttpPost(uri);
if(headers!=null){
for(Stringkey:headers.keySet()){
httpPost.setHeader(key,headers.get(key));
}
}
List<NameValuePair>params=newArrayList<NameValuePair>();
if(paramMap!=null){
for(Stringkey:paramMap.keySet()){
params.add(newBasicNameValuePair(key,paramMap.get(key)));
}
httpPost.setEntity(newByteArrayEntity(paramMap.get("reqData").getBytes("UTF-8")));
// httpPost.setEntity(newUrlEncodedFormEntity(params,
// DEFAULT_ENCODING));
}
HttpResponsehttpResponse=newDefaultHttpClient().execute(httpPost);
intstatusCode;
if((statusCode=httpResponse.getStatusLine().getStatusCode())==200){
returnEntityUtils.toString(httpResponse.getEntity());
}
thrownewIOException("statusis"+statusCode);
}
publicstaticStringpost(Stringuri,StringcontentType,Stringcontent)
throwsException{
org.apache.commons.httpclient.HttpClientclient=neworg.apache.commons.httpclient.HttpClient();
PostMethodpost=newPostMethod(uri);
RequestEntityentity=newStringRequestEntity(content,contentType,DEFAULT_ENCODING);
post.setRequestEntity(entity);
intstatusCode=client.executeMethod(post);
if(statusCode==200){
returnpost.getResponseBodyAsString();
}
thrownewIOException("statusis"+statusCode);
}
你可以設置下他的默認傳遞代碼方式:DEFAULT_ENCODING 為UTF-8
⑸ JAVA WEB 的get和post分別是什麼格式
GET 是在URL路徑直接拼來接參自數的形式進行的實現,也就是說數據是暴露在請求地址的,並且長度不能太長,通常文件流等實現起來有困難。
POST是只能看見請求的地址,其餘的參數是直接在瀏覽器內部進行的顯示和響應,數據相對來說是不暴露的,更安全一些,並且可以傳輸大量數據。
備註:通過以上說明,推薦實際應用中用Post請求進行開發。
⑹ 如何解決 Java 構造 HTTP 請求 POST 的返回值是亂碼
對返回結果使用適當的編碼格式,比如
newInputStreamReader(urlConn.getInputStream(),"gbk");//設置編碼
⑺ 如何發post請求 內容為json格式 java
一般這種發送請求的話,前端可以使用ajax,寫上post的方式,前端將對象轉成json的格式.
⑻ java http post 怎麼設置 raw格式
調試微信推廣支持中二維碼生成api的介面,使用chrome瀏覽器的postman插件,post請求時有一個選項是form-data,或者raw,使用raw可以請求成功,from-data不知道怎麼組裝key和value所以一直失敗。非常不明白raw是什麼意思,google網路都沒有相關的解釋。後來研究發現,其實raw方式使用的是純字元串的數據上傳方式,所以在POST之前,可能需要手工的把一些json/text/xml格式的數據轉換成字元串,是一種post原始請求,區別於form-data這種常用的key-value方式。
public static String result; public static void httpTest() throws ClientProtocolException, IOException { String token = "XRhjxAJZG3rFlPLg"; String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token; String json = "{"action_name":"QR_LIMIT_SCENE","action_info":{"scene":{"scene_id":234}}}"; HttpClient httpClient = new DefaultHttpClient(); HttpPost post = new HttpPost(url); StringEntity postingString = new StringEntity(json);// json傳遞 post.setEntity(postingString); post.setHeader("Content-type", "application/json"); HttpResponse response = httpClient.execute(post); String content = EntityUtils.toString(response.getEntity()); // Log.i("test",content); System.out.println(content); result = content; }
以上代碼中需要導入
import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils;
Android中自帶org.apache.http相關庫文件,所以可以快捷鍵(ctrl+shift+o)一次導入成功。
⑼ java web項目 在linux伺服器發送http post請求 中文亂碼
在進行post方式提交的時候,寫上request.setCharacterEncoding("UTF-8");
記住要在request設置提交參數之前設置字元編碼
祝:生活愉快
⑽ java post網頁後接收的漢字是unicode字元集 很急 在線等
你是否在windows上跑的呢來?如果是的話,你的輸源出也需要使用編碼:
///PrintWriterout=newPrintWriter(conn.getOutputStream()));
//增加輸出流的字元編碼
PrintWriterout=newPrintWriter(conn.getOutputStream(),"UTF-8");
如果你的後台使用servlet容器,你還需要在servlet裡面加上。
request.setCharacterEncoding("UTF-8")