`

httpclient post请求没设有置编码的问题

阅读更多
某个网站要通过post请求来返回数值。

使用httpclient发送post请求的过程如下:

	public static void main(String[] args) throws ClientProtocolException, IOException
	{
		
		String url="http://localhost:8888/service/test?world=世界";
		
		HttpClient client=new DefaultHttpClient();
		
		
		HttpPost postMethod=new HttpPost(url);
		
		HttpResponse response=null;
		
		
		
		//添加内容要通过List<NameValuePair>,pairs要转换为HttpEntity对象.
		//这个pairs会被作为post参数传递过去
		List<NameValuePair> pairs=new ArrayList<NameValuePair>();
		
		pairs.add(new BasicNameValuePair("hello","你好"));
 
		
		//这里是重点,如果不设置编码,那么httpclient就会使用默认的iso8859,服务器端就无法得到正确的中文编码
		postMethod.setEntity(new UrlEncodedFormEntity(pairs));
		
		response=client.execute(postMethod);
		
		System.out.println(response.getStatusLine().getStatusCode());
		
		
	}



然后我们写一个Servlet,用来接受post请求。


@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
	{	
		
		
		
		
		String hello=req.getParameter("hello");
		
		System.out.println("hello= "+hello);
		
		
		String world=req.getParameter("world");
		
		System.out.println("world="+world);
		
	}



这里总共有两个参数, 一个是通过URL地址附带的参数,一个是放入了Httpclient对象中的参数。

通过测试, 前者被servlet正常显示, 但是后者显示为??


这里要打开httpclient的UrlEncodedFormEntity类,看一下源码:

     /**
     * Constructs a new {@link UrlEncodedFormEntity} with the list
     * of parameters in the specified encoding.
     *
     * @param parameters list of name/value pairs
     * @param encoding encoding the name/value pairs be encoded with
     * @throws UnsupportedEncodingException if the encoding isn't supported
     */
    public UrlEncodedFormEntity (
        final List <? extends NameValuePair> parameters,
        final String encoding) throws UnsupportedEncodingException {
        super(URLEncodedUtils.format(parameters, encoding), encoding);
        setContentType(URLEncodedUtils.CONTENT_TYPE + HTTP.CHARSET_PARAM +
                (encoding != null ? encoding : HTTP.DEFAULT_CONTENT_CHARSET));
    }

    /**
     * Constructs a new {@link UrlEncodedFormEntity} with the list
     * of parameters with the default encoding of {@link HTTP#DEFAULT_CONTENT_CHARSET}
     *
     * @param parameters list of name/value pairs
     * @throws UnsupportedEncodingException if the default encoding isn't supported
     */
    public UrlEncodedFormEntity (
        final List <? extends NameValuePair> parameters) throws UnsupportedEncodingException {
        this(parameters, HTTP.DEFAULT_CONTENT_CHARSET);
    }


可以看到, 最终要使用
URLEncodedUtils.format(paraneters,encoding)
由于我们没有传encoding进去, 程序会调用HTTP.DEFAULT_CONTENT_CHARSET,
而这个对象的值就是"ISO-8859-1"。


因此要想中文通过post请求参数传入后台,就必须设定参数的编码。
将上面的代码改为:


	postMethod.setEntity(new UrlEncodedFormEntity(pairs,"utf-8"));


问题就解决了
=============================


这里其实可以修改httpclient的源码,
找到org.apache.http.protocol.HTTP,


这里把DEFAULT_CONTENT_CHARSET修改为UTF_8即可。
  • 大小: 109.7 KB
分享到:
评论

相关推荐

    httpclient发送post请求

    本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...

    SpringBoot使用httpclient发送Post请求时

    public static String post(String url, String params){ log.info("post url:" + url + " params:" + params); String responseStr = ""; try(CloseableHttpClient httpClient = HttpClients.createDefault()) {...

    httpclient post方式发送请求

    接下来,我们将探讨如何使用HTTPClient发送POST请求并附带JSON数据。首先,你需要创建一个`CloseableHttpClient`实例,然后使用`HttpPost`对象来指定请求URL。在POST请求中,我们将使用`EntityBuilder`来构建包含...

    (完整版)JAVA利用HttpClient进行POST请求(HTTPS).doc

    在使用HttpClient发送POST请求时,我们需要关心两个方面的问题:一是如何忽略证书验证过程,二是如何发送POST请求。对于前者,我们可以使用X509TrustManager来忽略证书验证过程。对于后者,我们可以使用HttpPost对象...

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...

    HttpClient发送post请求传输json数据

    在这个场景中,我们关注的是如何使用HttpClient来发送POST请求并传输JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于API接口的数据传递。 首先,我们需要引入Apache HttpClient...

    httpclient post json 数据

    "httpclient post json数据"这个主题就是关于如何使用C#的HttpClient类来向Web API发送POST请求,并且以JSON格式传输数据。下面将详细解释这一过程。 首先,理解JSON(JavaScript Object Notation)是一种轻量级的...

    HttpClient post请求

    HttpClient post请求(用于key-value格式的参数), post请求(用于请求json格式的参数),加入了请求头以及token认证,成功之后读取服务器返回过来的json字符串数据

    httpclient用法,发送get和post请求,设置header

    httpclient的用法,发送get请求和post请求,设置header

    httpclient发送get请求和post请求demo

    本文将深入探讨如何使用HttpClient进行GET和POST请求,并提供相关的代码示例。 首先,GET请求是最常见的HTTP请求类型,通常用于获取资源。在HttpClient中,发送GET请求可以通过`HttpGet`类实现。以下是一个简单的...

    使用HttpClient发送POST请求,并获取响应内容(附详细步骤).txt

    ### 使用HttpClient发送POST请求,并获取响应内容 #### 一、简介 在现代软件开发中,尤其是在Web应用领域,客户端与服务器之间的通信是非常重要的环节。Java作为一种广泛应用的编程语言,提供了多种方式来实现这一...

    HttpClient模拟get,post请求并发送请求参数(json等)

    接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...

    HttpClient实现POST GET和文件下载

    3. **设置请求体**:如果POST请求有数据需要提交,可以使用`HttpEntityEnclosingRequestBase.setEntity()`方法设置请求实体,例如,使用`StringEntity`或`UrlEncodedFormEntity`来封装数据。 4. **执行请求**:通过...

    对于C#(HttpClient)方式网络请求的封装

    1. **HttpClient的基本使用**:介绍HttpClient类的基本概念,包括如何创建实例,设置请求头,以及发送GET和POST请求。 2. **封装的设计**:讨论如何设计一个网络请求的通用接口或类,比如定义方法如`SendGetAsync`...

    httpclient get/post请求工具类(map参数封装)

    httpclient get/post请求工具类(map参数封装),方便调用

    使用HttpClient异步请求数据

    在这个场景下,`ConnectionServlet`可能负责接收`HttpClient`发送的GET或POST请求,处理后返回数据。 文件`4.8通过HttpClient异步请求数据`可能是一个示例代码或教程,讲述了如何在Android应用的4.8版本中使用`...

    HttpClient发送http请求(post和get)需要的jar包+内符java代码案例+注解详解

    3. **HttpClient POST请求**: POST请求常用于向服务器提交数据。下面是一个POST请求的例子,包括设置请求头和请求体: ```java import org.apache.http.HttpEntity; import org.apache....

    HttpClient异步请求

    本篇文章将深入探讨HttpClient的异步请求特性,以及如何使用它来发送GET和POST请求。 在Java中,同步请求会阻塞调用线程,直到服务器返回响应。然而,异步请求允许程序在等待响应的同时继续执行其他任务,提高了...

Global site tag (gtag.js) - Google Analytics