---恢复内容开始---

此随笔都是一些网上的小实例,我学习后,添上一些注释。菜鸡程序员,水平较低,如有问题请指出。

httpclient是一种封装好的http协议的工具包,相对于httpconection来说,会比较简单,功能更多。

HttpClient有两个重要方法,一个post,一个get,顾名思义一个是用来发送数据,得到返回值,一个是直接请求地址得到返回值。

下面是几个post和get的实例:

1.get小实例。

public class GGGGGG {
public String doGet(){
String url="http://www.123.com/xxxx/ccc";
String result ="";
HttpGet httpRequst = new HttpGet(url);
try{
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequst); //执行获得返回值
if(httpResponse.getStatusLine().getStatusCode()==200){
HttpEntity httpEntity = httpResponse.getEntity(); //得到报文
result = EntityUtils.toString(httpEntity); //转化格式
} else
httpRequst.abort(); //终止
}catch (ClientProtocolException e) {
e.printStackTrace();
result = e.getMessage().toString();
} catch (IOException e) {
e.printStackTrace();
result = e.getMessage().toString();
}
return result;
}
}

这个例子是一个很简单的get实例,对取出来的数据只是做了一个转换类型的处理。注意httpRequst.abort() 这里 ,当发现返回的状态getStatusCode()不是200是,就是报错了,要关闭流。

2.get小实例。

public class HHH {
public static void main(String[] args) throws ClientProtocolException, IOException{
HttpClient hc = new DefaultHttpClient(); //新建接口子类
HttpGet hg = new HttpGet("http:www.baidu.com"); //封装请求地址
HttpResponse res = hc.execute(hg); //发送请求 得到返回值
HttpEntity entity = res.getEntity(); //取得报文 包含服务器响应内容
if(entity !=null){ //判断报文不为空
InputStream insm = entity.getContent(); //用流得到内容
String str = convertStreamToString(insm); //InputStream转化为String
hg.abort(); //http请求终止
}
}

public static String convertStreamToString(InputStream is){ //转换
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null ;
try{
while((line = reader.readLine())!=null){
sb.append(line+"\n");
}
} catch (IOException e){
e.printStackTrace();
}finally{
try{
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
return sb.toString();
}
}

这个例子和上面例子一样,只是把流里的数据转换为了String类型。

3.post方法小实例

public class PPPP {

public String hPost(){
String url ="http://123.456.789.1";
String result = "";
HttpPost httpRequset = new HttpPost(url); //实例化http接口
List <NameValuePair> params = new ArrayList<NameValuePair>(); //实例化http数组
params.add(new BasicNameValuePair("content","I am so cool")); //放入参数
try{
httpRequset.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //往报文中传入参数和字符编码
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequset); //执行或得返回值
if(httpResponse.getStatusLine().getStatusCode()== 200){
HttpEntity httpEntity = httpResponse.getEntity(); //得到返回报文
result = EntityUtils.toString(httpEntity); //转换为String格式
}
} catch (UnsupportedEncodingException e){
e.printStackTrace();
result = e.getMessage().toString();
}
catch (ClientProtocolException e) {
e.printStackTrace();
result = e.getMessage().toString();
}
catch (IOException e) {
e.printStackTrace();
result = e.getMessage().toString();
}
return result;
}
}

如果使用HttpPost方法提交HTTP POST请求,则需要使用HttpPost类的setEntity方法设置请求参数。参数则必须用NameValuePair[]数组存储

post方法 注意httpRequset.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)),UrlEncodedFormEntity方法百度到的意思是构造一个新的UrlEncodedFormEntity与列表指定的参数编码。我理解的是给params对应的字符编码设置为HTTP.UTF_8。平时使用post请求返回的字符尤其是汉字是乱码时,请检查这里的设置,改为与接口对应的字符编码。

4.post小实例

public class PPP {
public static void main(String[] args) { //post 我准备传的参数
String name ="joe";
String age ="22";
String content ="cool";
String ret = sendSms(name,age,content); //调用执行方法
System.out.println(ret);
if(ret.indexOf("失败")<0){
System.out.print("成功发送");
}
else{
System.out.print("发送失败");
}
}

public static String sendSms(String name,String age,String content){ //接收参数执行
HttpClient httpclient = new DefaultHttpClient(); //新建子类
String url = "http://192.168.0.1/aaaaa/sedsms";
HttpPost httppost = new HttpPost(url); //封装发送地址
String res = ""; //定义返回值

try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); //实例化NameValuePair 传参
JSONObject jobj = new JSONObject(); //新建json对象放参数
jobj.put("name",name);
jobj.put("age",age);
jobj.put("content",content);

nameValuePairs.add(new BasicNameValuePair("msg", getStringFromJson(jobj))); //往NameValuePair传参
httppost.addHeader("Content-type", "application/x-www-form-urlencoded"); //设置http报文属性
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); //传入报文,设置文字编码
HttpResponse response = httpclient.execute(httppost); //执行获得返回值
if(response.getStatusLine().getStatusCode() == 200){ //返回200状态往下执行
String conResult = EntityUtils.toString(response.getEntity()); //得到返回报文 转换为string格式
JSONObject sobj = new JSONObject(); //新建json
sobj = sobj.fromObject(conResult); //得到的string对象内容转换为json对象
String result = sobj.getString("result"); //使用getString方法或得到值
String code = sobj.getString("code");
if(result.equals("1")){
res += "发送成功";
}else{
res += "发送失败,"+code;
}
} else {
String err = response.getStatusLine().getStatusCode()+"";
res += "发送失败:"+err; }
}catch (ClientProtocolException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return res;
}
private static String getStringFromJson(JSONObject adata) {       //拼参数
StringBuffer sb = new StringBuffer();
sb.append("{");
for(Object key:adata.keySet()){
sb.append("\""+key+"\":\""+adata.get(key)+"\",");
}
String rtn = sb.toString().substring(0, sb.toString().length()-1)+"}";
return rtn;
}
}

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 方法中的NameValuePair数组为HttpClient中特定的键值对数据存储类型,和form表单比较类似。

总结

使用 HttpClient 需要以下 6 个步骤:
1. 创建 HttpClient 的实例。
2. 创建某种连接方法的实例,httppost ,httpget ,GetMethod之类。
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的实例。
4. 读 response。
5. 释放连接。无论执行方法是否成功,都必须释放连接close(),abort()。
6. 对得到后的内容进行处理。
在发请求需要设置各项参数时可以参考如下:

HttpParams httpParameters = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, 10*1000);//设置请求超时10秒

HttpConnectionParams.setSoTimeout(httpParameters, 10*1000); //设置等待数据超时10秒

HttpConnectionParams.setSocketBufferSize(params, 8192);   //设置数据流长度

HttpClient httpclient = new DefaultHttpClient(httpParameters); //此时构造DefaultHttpClient时将参数传入

getStatusCode()方法获取返回状态码,附上Http请求的状态码:

成功2××          成功处理了请求的状态码。

200                   服务器已成功处理了请求并提供了请求的网页。

204                   服务器成功处理了请求,但没有返回任何内容。                         
重定向3××       每次请求中使用重定向不要超过 5 次。301                   请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。302                   请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。304                   如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。客户端错误4××  表示请求可能出错,妨碍了服务器的处理。400                    服务器不理解请求的语法。403                    服务器拒绝请求。404                    服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。410                    请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 代码。如果资源已永久删除,应当使用 301 指定资源的新位置。服务器错误5××   表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。500                     服务器遇到错误,无法完成请求。503                     服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。 

转载于:https://www.cnblogs.com/cloudjoe/p/5085327.html

httpclient学习记录相关推荐

  1. Android 开发学习记录(4)---- httpclient使用(三)

    之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户. 但是现在好多网站在登录时 ...

  2. Elasticseach 从零开始学习记录(四) - 整合springboot2.x

    1. 我的springboot版本为2.2.6.RELEASE, 本文推荐elasticsearch-rest-high-level-client在           springboot里集成el ...

  3. eclipse maven配置_Gradle学习记录015 声明仓库,检查依赖,管理依赖的配置

    本片由三部分组成,第一部分声明仓库的参考链接如下: https://docs.gradle.org/current/userguide/repository_types.html 第二部分检查依赖的依 ...

  4. 前端逻辑练习题+学习记录 不定期更新

    编程题 1.返回数组中最大的数字(reduce函数) largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1 ...

  5. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  6. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

  7. springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis

    本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...

  8. 【Cmake】Cmake学习记录

    Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...

  9. HttpClient学习

    HttpClient学习 (1)下面列举几个主要的Http相关概念的类 类名 描述 HttpClient 建立请求客户端 HttpGet 代表请求方法,类似的还有HttpHead, HttpPost, ...

最新文章

  1. cmakelist 寻找opencv
  2. CSP认证201709-4 通信网络[C++题解]:dfs、建立两张图:正向建图和反向见图、统计联通点的个数
  3. 邮宝打印面单尺寸调整_摆脱束缚,自由轻松!无线打印奥利给(上)
  4. Python—实训day12—汽车用户消费投诉案例-分析及可视化
  5. List 集合转换为String
  6. 高性能微服务网关.NETCore客户端Kong.Net开源发布
  7. 萤火虫小程序_9.9元起!萤火虫中秋文化节来了!特价门票限量秒杀,手慢无!...
  8. RHEL7 本地yum源配置
  9. 学习进度条__软件工程概论第一周学习计划
  10. verilog 学习记(如何编写assert)
  11. 重启apache下php,linux下apache重启并查看php环境
  12. P1268 树的重量
  13. asp.net mvc cms项目Oxite
  14. 2. MFC编程——各函数作用
  15. python语言用什么编译器_如何修改python语言pycharm工具的默认编译器
  16. python引用列表中的变量_我可以获得在Python 2.7中引用其他变量的变量列表吗?...
  17. jdbc获取数据库连接的四种方式
  18. 百度地图-根据地址获取经纬度
  19. 开发一个APP的详细流程有什么?
  20. 解决U8库龄分析报表数量与实际结存数量不一致问题

热门文章

  1. 市场调研—2021-2027中国磷酸一铵市场现状及未来发展趋势
  2. 【操作随记】Markdown表格不生效不生效
  3. 数据分析师到底是干啥的?数据分析值不值得学
  4. 基于SSH的安全远程登录
  5. Anaconda安装fake_useragent、tesseract-ocr、scrapy
  6. 详解 Python Map 函数
  7. 几个不错的独立网管博客
  8. 标准日本语初级上 应用课文
  9. LNK2019 unresolved external symbol symbol referenced in function
  10. 3DCAT首届行业生态交流会|爱智慧科技有限公司CEO梁新刚:工业元宇宙的”形“与”神“