httpclient学习记录
---恢复内容开始---
此随笔都是一些网上的小实例,我学习后,添上一些注释。菜鸡程序员,水平较低,如有问题请指出。
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表单比较类似。
总结
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学习记录相关推荐
- Android 开发学习记录(4)---- httpclient使用(三)
之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户. 但是现在好多网站在登录时 ...
- Elasticseach 从零开始学习记录(四) - 整合springboot2.x
1. 我的springboot版本为2.2.6.RELEASE, 本文推荐elasticsearch-rest-high-level-client在 springboot里集成el ...
- eclipse maven配置_Gradle学习记录015 声明仓库,检查依赖,管理依赖的配置
本片由三部分组成,第一部分声明仓库的参考链接如下: https://docs.gradle.org/current/userguide/repository_types.html 第二部分检查依赖的依 ...
- 前端逻辑练习题+学习记录 不定期更新
编程题 1.返回数组中最大的数字(reduce函数) largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1 ...
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
- HTML5与CSS3权威指南之CSS3学习记录
title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...
- springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis
本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...
- 【Cmake】Cmake学习记录
Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...
- HttpClient学习
HttpClient学习 (1)下面列举几个主要的Http相关概念的类 类名 描述 HttpClient 建立请求客户端 HttpGet 代表请求方法,类似的还有HttpHead, HttpPost, ...
最新文章
- cmakelist 寻找opencv
- CSP认证201709-4	通信网络[C++题解]:dfs、建立两张图:正向建图和反向见图、统计联通点的个数
- 邮宝打印面单尺寸调整_摆脱束缚,自由轻松!无线打印奥利给(上)
- Python—实训day12—汽车用户消费投诉案例-分析及可视化
- List 集合转换为String
- 高性能微服务网关.NETCore客户端Kong.Net开源发布
- 萤火虫小程序_9.9元起!萤火虫中秋文化节来了!特价门票限量秒杀,手慢无!...
- RHEL7 本地yum源配置
- 学习进度条__软件工程概论第一周学习计划
- verilog 学习记(如何编写assert)
- 重启apache下php,linux下apache重启并查看php环境
- P1268 树的重量
- asp.net mvc cms项目Oxite
- 2. MFC编程——各函数作用
- python语言用什么编译器_如何修改python语言pycharm工具的默认编译器
- python引用列表中的变量_我可以获得在Python 2.7中引用其他变量的变量列表吗?...
- jdbc获取数据库连接的四种方式
- 百度地图-根据地址获取经纬度
- 开发一个APP的详细流程有什么?
- 解决U8库龄分析报表数量与实际结存数量不一致问题
热门文章
- 市场调研—2021-2027中国磷酸一铵市场现状及未来发展趋势
- 【操作随记】Markdown表格不生效不生效
- 数据分析师到底是干啥的?数据分析值不值得学
- 基于SSH的安全远程登录
- Anaconda安装fake_useragent、tesseract-ocr、scrapy
- 详解 Python Map 函数
- 几个不错的独立网管博客
- 标准日本语初级上 应用课文
- LNK2019 unresolved external symbol symbol referenced in function
- 3DCAT首届行业生态交流会|爱智慧科技有限公司CEO梁新刚:工业元宇宙的”形“与”神“