详细说明查看:
MultipartEntity与UrlEncodedFormEntity区别
今天在弄安卓项目的时候,碰到一个问题,就是安卓在登录请求服务器的时候,总是报Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 8080) after 90000ms: isConnected failed: ECONNREFUSED (Connection refused) ,一开始的时候,我将post请求换成get 请求,都不行,我以为还是安卓权限什么的问题呢,后来经过排除发现不是,在浏览器中输入webservice地址就可以成功,但是在服务器经过JUnit 测试 发现不能请求,此时将注意力从安卓转移到了服务器上,
开始的时候封装的方法是这样写的:
public static InputStream post(String url, MultipartEntity parameters) {
HttpClient client = new DefaultHttpClient();
HttpPost postrequest = new HttpPost(url); try { if (parameters != null) { postrequest.setEntity(parameters); } HttpResponse postresponse = client.execute(postrequest); InputStream is = postresponse.getEntity().getContent(); return is; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; }
后来发现改下面这种就可以访问成功:
public static InputStream post(String url, List<NameValuePair> parameters) {
HttpClient client = new DefaultHttpClient();
HttpPost postrequest = new HttpPost(url); try { if (parameters != null) { UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters); // postrequest.setEntity(parameters); postrequest.setEntity(formEntiry); } HttpResponse postresponse = client.execute(postrequest); InputStream is = postresponse.getEntity().getContent(); return is; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; }
其中,主要是MultipartEntity与UrlEncodedFormEntity参数不同
经过在网上查询资料发现,这两个类均实现了HttpEntity接口,而二者的区别就和html表单有关系,
html中的form 表单有两种:除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的 类型为multipart/form-data。 后者主要是用来上传文件所用,所以一般情况下,在使用webservice 时,使用UrlEncodedFormEntity 比较多,UrlEncodedFormEntity 可以模拟传统的HTML表单传送POST请求中的参数,
如:html表单如下:
<form action=”http://localhost/index.html” method=”POST”>
<input type=”text” name=”param1″ value=”李三”/> <input type=”text” name=”param2″ value=”男”/> <inupt type=”submit” value=”submit”/> </form>
代码如下:
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair(“param1″, “李三”)); formParams.add(new BasicNameValuePair(“param2″, “男”)); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, “UTF-8″);MultipartEntity 则与form类型为multipart/form-data 对应,如 html from 如下:
<form action=”http://localhost/index.html” method=”POST”
enctype=”multipart/form-data”> <input type=”text” name=”param1″ value=”李三”/> <input type=”text” name=”param2″ value=”男”/> <input type=”file” name=”param3″/> <inupt type=”submit” value=”submit”/> </form>代码如下:
MultipartEntity entity = new MultipartEntity();
entity.addPart(“param1″, new StringBody(“李三”, Charset.forName(“UTF-8″))); entity.addPart(“param2″, new StringBody(“男”, Charset.forName(“UTF-8″))); entity.addPart(“param3″, new FileBody(new File(“C:\\pic.gif”)));