HttpClient的get和post

C# HttpClient GET/POST 请求 除了使用 WebRequest 对象可以给服务器发送POST,GET请求外,还可以使用HttpClient对象。1. 使用 HttpClient 发送GET请求下测试代码演示了发送一个简单的Http Get 请求,接受HTTP 响应数据。using System.Net;using System.Net.Http; static async Task Main(string[] args)        {      &nb 阅读详情

HttpClient的get和post

这个HttpClient就类似于电脑上用的浏览器。当我打开多个网页的时候,并不需要开一个网页就开一个浏览器,而是一个浏览器上面开了好几个网页。对应于HttpClient,即无需连接一次就new一个HttpClient。一般,我们希望一个应用里就一个HttpClient就ok了,就像我们的手机或PC,没人会呼呼的装好几个浏览器。本文即解决此问题,代码可以直接拿过去复用。

1.自然而然想到单例。

public class MyHttpClient {
private static HttpClient mHttpClient = null;
private static final String CHARSET = HTTP.UTF_8;
//将构造函数封掉,只能通过对外接口来获取HttpClient实例
private MyHttpClient(){
}
public static HttpClient getHttpClient(){
    if(mHttpClient == null){
        mHttpClient = new DefaultHttpClient();
    }
    return mHttpClient;
    }
}

上面很簡單但是不能满足多线程的要求,不能同时完成多个Http请求时。

2.线程安全的HttpClient
可以创建线程安全的HttpClient,即通过ClientConnectionManager 来完成。下面贴出完整代码:

import org.apache.http.HttpVersion;  
import org.apache.http.client.HttpClient;  
import org.apache.http.conn.ClientConnectionManager;  
import org.apache.http.conn.params.ConnManagerParams;  
import org.apache.http.conn.scheme.PlainSocketFactory;  
import org.apache.http.conn.scheme.Scheme;  
import org.apache.http.conn.scheme.SchemeRegistry;  
import org.apache.http.conn.ssl.SSLSocketFactory;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;  
import org.apache.http.params.BasicHttpParams;  
import org.apache.http.params.HttpConnectionParams;  
import org.apache.http.params.HttpParams;  
import org.apache.http.params.HttpProtocolParams;  
import org.apache.http.protocol.HTTP;  

public class MyHttpClient {  
    private static HttpClient mHttpClient = null;  
    private static final String CHARSET = HTTP.UTF_8;  
    //将构造函数封掉,只能通过对外接口来获取HttpClient实例  
    private MyHttpClient(){  

    }  
    public static HttpClient getHttpClient(){  
        if(mHttpClient == null){  
            mHttpClient = new DefaultHttpClient();  
        }  
        return mHttpClient;  
    }  
    public static synchronized HttpClient getSaveHttpClient(){  
        if(mHttpClient == null){  
            HttpParams params = new BasicHttpParams();  
            //设置基本参数  
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
            HttpProtocolParams.setContentCharset(params, CHARSET);  
            HttpProtocolParams.setUseExpectContinue(params, true);  
            //超时设置  
            /*从连接池中取连接的超时时间*/  
            ConnManagerParams.setTimeout(params, 1000);  
            /*连接超时*/  
            HttpConnectionParams.setConnectionTimeout(params, 2000);  
            /*请求超时*/  
            HttpConnectionParams.setSoTimeout(params, 4000);  
            //设置HttpClient支持HTTp和HTTPS两种模式  
            SchemeRegistry schReg = new SchemeRegistry();  
            schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
            schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
            //使用线程安全的连接管理来创建HttpClient  
            ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);  
            mHttpClient = new DefaultHttpClient(conMgr, params);  
        }  
        return mHttpClient;  
    }  

}  

方法getSaveHttpClient()即可获得线程安全的单例httpClient,注释很详细了啥都不说了,可以直接使用。

3、已经很完美了,还能不能再优化呢?
可以使用Application来进一步优化创建HttpClient的时机及其他配置。Application的相关知识参见:链接
新建包名org.yanzi.application,在里面新建MyApplication.java,完整代码如下:

import org.apache.http.HttpVersion;  
import org.apache.http.client.HttpClient;  
import org.apache.http.conn.ClientConnectionManager;  
import org.apache.http.conn.params.ConnManagerParams;  
import org.apache.http.conn.scheme.PlainSocketFactory;  
import org.apache.http.conn.scheme.Scheme;  
import org.apache.http.conn.scheme.SchemeRegistry;  
import org.apache.http.conn.ssl.SSLSocketFactory;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;  
import org.apache.http.params.BasicHttpParams;  
import org.apache.http.params.HttpConnectionParams;  
import org.apache.http.params.HttpParams;  
import org.apache.http.params.HttpProtocolParams;  
import org.apache.http.protocol.HTTP;  

import android.app.Application;  

public class MyApplication extends Application {  
    private HttpClient mHttpClient = null;  
    private static final String CHARSET = HTTP.UTF_8;  
    @Override  
    public void onCreate() {  
        // TODO Auto-generated method stub  
        super.onCreate();  
        mHttpClient = this.createHttpClient();  
    } 
     @Override  
    public void onTerminate() {  
        // TODO Auto-generated method stub  
        super.onTerminate();  
        this.shutdownHttpClient();  
    }  

    @Override  
    public void onLowMemory() {  
        // TODO Auto-generated method stub  
        super.onLowMemory();  
        this.shutdownHttpClient();  
    }  

    /**创建HttpClient实例 
     * @return 
     */  
    private HttpClient createHttpClient(){  
        HttpParams params = new BasicHttpParams();  
        //设置基本参数  
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
        HttpProtocolParams.setContentCharset(params, CHARSET);  
        HttpProtocolParams.setUseExpectContinue(params, true);  
        //超时设置  
        /*从连接池中取连接的超时时间*/  
        ConnManagerParams.setTimeout(params, 1000);  
        /*连接超时*/  
        HttpConnectionParams.setConnectionTimeout(params, 2000);  
        /*请求超时*/  
        HttpConnectionParams.setSoTimeout(params, 4000);  
        //设置HttpClient支持HTTp和HTTPS两种模式  
        SchemeRegistry schReg = new SchemeRegistry();  
        schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
        schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
        //使用线程安全的连接管理来创建HttpClient  
        ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);  
        HttpClient client = new DefaultHttpClient(conMgr, params);  
        return client;  
    }  
    private void shutdownHttpClient(){  
        if(mHttpClient != null && mHttpClient.getConnectionManager() != null){  
            mHttpClient.getConnectionManager().shutdown();  
        }  
    }  
    public HttpClient getHttpClient(){  
        return mHttpClient;  
    }  

}   

然后再AndroidManifest.xml理添加:
android:name=”org.yanzi.application.MyApplication”

<application  
        android:name="org.yanzi.application.MyApplication"  
        android:allowBackup="true"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name"  
        android:theme="@style/AppTheme" >  
        <activity  
            android:name="org.yanzi.testtomecat.MainActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  

                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>

然后再Activity里,通过mMyApplication = (MyApplication)getApplication();
mMyApplication.getHttpClient()得到HttpClient就可以使用了。
可以看到在Application的onCreate里就实例化了HttpClient,且在低内存和关闭时关闭连接管理器,释放资源,比2中的写到一个普通文件里更优。

import java.io.IOException;  
import java.util.List;  

import org.apache.http.HttpResponse;  
import org.apache.http.HttpStatus;  
import org.apache.http.NameValuePair;  
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.entity.UrlEncodedFormEntity;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.params.BasicHttpParams;  
import org.apache.http.params.HttpConnectionParams;  
import org.apache.http.params.HttpParams;  

import android.util.Log;  

public class HttpRequest {  
    /** 
     *Post请求 
     */  
    public void doPost(String url , List<NameValuePair> nameValuePairs){  
        //新建HttpClient对象    
        HttpClient httpclient = new DefaultHttpClient();  
        //创建POST连接  
        HttpPost httppost = new HttpPost(url);  
        try {  
//          //使用PSOT方式,必须用NameValuePair数组传递参数  
//          List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
//          nameValuePairs.add(new BasicNameValuePair("id", "12345"));  
//          nameValuePairs.add(new BasicNameValuePair("stringdata","hps is Cool!"));  
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
            HttpResponse response = httpclient.execute(httppost);  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  

    /** 
     *Get请求 
     */  
    public void doGet(String url){  
        HttpParams httpParams = new BasicHttpParams();  
        HttpConnectionParams.setConnectionTimeout(httpParams,30000);    
        HttpConnectionParams.setSoTimeout(httpParams, 30000);    

        HttpClient httpClient = new DefaultHttpClient(httpParams);    
        // GET  
        HttpGet httpGet = new HttpGet(url);  
        try {  
            HttpResponse response = httpClient.execute(httpGet);  
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){  
                Log.i("GET", "Bad Request!");  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

    }  
}  

需要注意的是:
1. 使用POST方式时,传递参数必须使用NameValuePair数组
2. 使用GET方式时,通过URL传递参数,注意写法
3. 通过setEntity方法来传递数据
4. 通过DefaultHttpClient的execute方法来发送HTTP请求获取HttpResponse
5. 通过getEntity()从Response中获取内容

String content = EntityUtils.toString(response.getEntity());

特别说明:
对于WCF的json服务,请求时如下:

/**  
     *Post请求  
     * @throws IOException  
     * @throws ClientProtocolException  
     */    
    public static String doPost(String url , List<NameValuePair> nameValuePairs) throws ClientProtocolException, IOException{   
        String result = null;  
        //新建HttpClient对象      
        HttpClient httpclient = new DefaultHttpClient();    
        //创建POST连接    
        HttpPost httppost = new HttpPost(url);    
        httppost.setHeader("content-type", "application/json");  
        try {  
            if(nameValuePairs != null) {  
                StringEntity entity = new StringEntity("这里是JSON数据,如{"id":"12","name":"xiaoming"}", "utf-8");  
                entity.setContentType("application/json");  
                entity.setContentEncoding("utf-8");  
                httppost.setEntity(entity);  
            }  

//          if(nameValuePairs != null) {  
//              httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));    
//          }  
            HttpResponse response = httpclient.execute(httppost);    
            if (response.getStatusLine().getStatusCode() != 404)  
            {  
                    result = EntityUtils.toString(response.getEntity());  
                    Logger.d(TAG, "Response: " + result);  
            }  
        } finally {  

        }  
        return result;  
    }  

其实就相当于传数据流的方式。

Java使用HttpClient发送Get和Post请求 HttpClient是什么,用来干什么,怎么用?这三个问题还是看官方教程吧 英文的官方教程: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html 中文的官方教程: https://www.ctolib.com/topics-80581.html 需要的Jar包下载: http://hc.apach... 阅读详情

相关推荐

UWP——HttpClient模拟浏览器的GET、POST请求

在MVC学习系列继续之前,这里先插一篇——HttpClient模拟浏览器的GET、POST请求。这也是我的第一个UWP应用程序。这一篇和上一篇类似,只不过将HttpWebRequest换成了HttpClient。我们还是先看一下修改之前的数据,如下图: 之后,我们还是点击【编辑】,并利用Fiddler监测请求数据。截图这里不用了,和上一篇中一样。下面我们先看一下在UWP程序中利用Http

duyelang的专栏 5366

httpclient发送Get请求和Post请求

httpclient发送get请求和post请求

weixin_42274846的博客 5869

HttpClient 发送get和post请求

一个简单的易学的 基于HttpClient 4.3发送psot及get请求,返回数据,适合初学者,适合初学者

HttpClient使用详解与实战一:普通的GET和POST请求

简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 HttpClient最新版本是HttpClient 4.5.3 (GA)。 官方下载:http://hc.apache.org/downloads.cgi 主要特性 基于标准、纯净的Jav...

weixin_30673611的博客 892

无人机信号干扰系统设计方案

设计定向阻塞干扰器需要结合射频(RF)技术、功率放大技术和定向天线技术,核心目标是向特定方向发射高功率噪声信号,覆盖目标频段,阻断无人机的通信或导航信号。实际设计中需平衡功率、效率、散热和便携性,同时需考虑抗干扰技术的快速演进(如无人机加密通信和AI避障)。在合法框架下,此类设备可有效应对“黑飞”威胁,但技术滥用风险需严格管控。定向阻塞干扰器的硬件设计核心在于。

wanghao312的博客 3060

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3250

为GET和POST请求添加请求参数和请求头

  我们平常浏览各个网站时,不免有时候就需要填写一些信息,比如注册时,登录时,这些信息一般都是通过GET请求或者POST(敏感信息一般使用POST,数据隐藏,相对来说更安全)请求提交到后台,经过后台的一系列处理,再返回给前台结果,前台进行处理。 GET请求携带请求参数和请求头: @Test public void getParams() { // 获取连接客户端工具 Cl...

大漠知秋的加油站 12万+

上海市大数据中心笔试模拟试卷

为帮助考生熟悉上海市大数据中心笔试的题型、考点及答题逻辑,以下整理了一份的模拟试卷,涵盖大数据专业知识、行政职业能力测试(行测)、公共基础知识(含上海本地政策)三大核心模块,并附详细答案解析。

一叶之秋的博客 1815

java使用httpclient封装post请求和get的请求

  在我们程序员生涯中,经常要复用代码,所以我们应该养成时常整理代码的好习惯,以下是我之前封装的httpclient的post和get请求所用的代码: package com.marco.common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; i...

天高任鸟飞,海阔凭鱼跃 11万+

北京联通IPTV组播实战:OpenWRT软路由配置全解析

本文详细解析了在北京联通IPTV环境下,利用OpenWRT软路由和udpxy工具实现组播转单播的实战配置。内容涵盖网络接口设置、防火墙规则、udpxy安装配置、直播源M3U文件处理以及全平台播放指南,帮助用户无需机顶盒即可在家庭局域网内任何设备上流畅观看电视直播。

weixin_29313547的博客 1407

嵌入式调光控制库:轻量级软启/渐变/记忆逻辑实现

调光控制是智能照明系统的核心基础功能,涉及亮度调节、人机交互与电气安全多重需求。其底层原理依赖于对相位角或PWM占空比的精确时序控制,并需融合软启动、渐变过渡、状态记忆等工程化逻辑。这类轻量级调光行为逻辑层,不直接操作硬件寄存器,而是以确定性、无动态内存、可配置的方式封装用户意图到目标亮度值(0–100%)的映射过程,显著提升产品鲁棒性与跨平台复用能力。广泛应用于TRIAC交流调光、LED直流PWM驱动及DALI/Matter等智能照明协议网关中,尤其适合资源受限的Cortex-M系列MCU和FreeRTO

weixin_28949937的博客 579

httpclient中get和post的区别

Httpclient中get和post的区别

grow_up_footstep的博客 754

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 373

HttpClient 发送 get、post 请求

HttpClient 介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HttpClient是客户端的http通信实现库,这个类库的作用是接收和发送http报文 添加Maven依赖 <!--****** httpclient start ******--> <dependency&gt..

LMGD的博客 1万+

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2610

Vue3 - 详解播放m3u8视频流+HLS拉流推流完整方案,vue3如何播放m3u8格式文件实时视频播放教程(流媒体播放、直播视频流、实时摄像头监控视频流对接、后端服务器切片分片传输视频流边下边播)

vue3组件播放m3u8格式视频,实现hls流媒体监控摄像头实时播放,vue3播放m3u8视频流格式,实时直播画面视频流播放,摄像头监控画面推流,hls.js,Vue Video.js播放m3u8视频流格式,实现hls流媒体监控摄像头实时播放,vue中使用video.js播放m3u8格式的视频,m3u8格式视频,通过HLS协议播放m3u8格式视频,黑屏不显示怎么办,视频非常卡加载缓慢,拉流报错,推流报错,播放失败,播放监控m3u8视频流格式,苹果ios播放,vue3中使用video标签播放MP4,西瓜视频插

🏆 前端领域优质创作者 5940

HttpClient发送get/post请求

1.需要的maven依赖: <!--httpClient需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId>...

sunny潘先生的博客 3738

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HttpClient之Get、Post方法

文章目录1 前言2 HttpGet方法2.1 步骤2.2 示例3 HttpPost方法3.1 步骤3.2 示例4 小结5 写在后面 1 前言 HttpClient是由Apache基金会出品的一个传输库,通过该库可以发送和接收Http消息,在JDK11中被集成。 由于最近业务可能需要使用,就学习了httpclient的简单用法,下面就从最简单的get、post请求入手。 项目需要maven坐标如下: <!-- https://mvnrepository.com/artifact/com.alibaba/

someone's Blog 1589

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

httpclient GET 和POST 请求

*** 测试通过httpclient发送get请求*/@Test//创建httpclient对象//创建请求对象//发送请求,接受响应结果//获取服务端返回的状态码System.out.println("服务端返回的状态码:" + statusCode);//获得具体的响应数据//获得响应体//解析HttpEntity对象 转化为string字符串//响应体body。

2401_84239732的博客 1021

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

HttpClient发送Get、Post请求简单实践

1. 配置及初始化HttpClient: private static final CloseableHttpClient httpclient; public static final String CHARSET = "UTF-8"; static{ RequestConfig config = RequestConfig.custom().setConnectTimeout

安静的偏执的专栏 2万+

JAVA 利用HttpClient封装get和post请求

在开发web项目时,有时候我们需要调用外部的接口。在查阅一下一些资料后,决定自己封装一个HttpRequest,此处是利用了HttpClient这个包:package com.master.core; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apac...

Mr_xiatian的博客 5100

HttpClient3.x之Get请求和Post请求示例

HttpClient的支持在HTTP/1.1规范中定义的所有的HTTP方法:GET, HEAD, POST, PUT, DELETE, TRACE 和 OPTIONS。每有一个方法都有一个对应的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。所有的这些类均实现了HttpUriRequest接口,故可以作为ex

崔成龙 . 勇往直前 4357

HttpClient应用之GET和POST申请

其实,post与get很容易区别,说白了就是GET请求不代表单,什么意思呢,就是说GET请求只能发送一个URL,可带参数的URL,比如http://smartshop.coding.io/api/v1/getgoodprice(这是我们大创项目的服务器,资源是什么就不说了)这个URL,我想访问,但是服务器要求你访问这个资源要带两个参数,一个是qcode,一个是busi_id,这样访问的URL就可以

nvnnv的博客 651

HttpClient发送get请求和post请求

新建两个项目:test-demo为接口方法,httpclient-demo测试发送get请求和post请求。 1.Httpclient发送get请求 httpclient-demo中测试方法 httpclient-demo中工具类 test-demo接口方法 2.Httpclient发送post请求 httpclient-demo中测试方法 Httpclient-de...

Jeffrey的博客 5376

HttpClient 发送 GET 和 POST 请求深度解析

Apache HttpClient 是一个开源的 HTTP 客户端库,提供了对 HTTP 协议的全面支持。它简化了 HTTP 请求的创建和处理,使得开发者可以方便地与 Web 服务器进行交互。HttpClient 支持 HTTP/1.1 和 HTTP/2 协议,并且提供了丰富的功能,如连接管理、请求重试、认证和代理支持等。

xycxycooo的博客 5743

HttpClient发送get 、post请求json

HTTP的三种超时说明 1.connectionRequestTimout 指从连接池获取连接的timeout 2.connetionTimeout 指客户端和服务器建立连接的timeout, 就是http请求的三个阶段,一:建立连接;二:数据传送;三,断开连接。超时后会ConnectionTimeOutException 3.socketTimeout 指客户端和服务器建立连接后,客户端从服务器读取数据的timeout,超出后会抛出SocketTimeOutException Get请求和Post请求其实

cqzdmm的博客 6225
上一篇: permission is only granted to system apps
下一篇: Webview使用详解
hi_Xing
博客等级 码龄12年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值