httpclient调用execute(httpget)报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpclient调用execute(httpget)报错相关的知识,希望对你有一定的参考价值。

官方文档上是这样写的:

正在学习,不明白为什么报错,求解

你是直接在类里定义这三个属性初始化的吗?比如:

public class $
    CloseableHttpClient client = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet("");
    CloseableHttpResponse response = client.execute(httpGet);

如果是这样可不行的哦,client.execute(httpGet)明确抛出了一个叫ClientProtoclException的异常,你需要做的是捕获或者再次抛出它。像这样就好了

public class $
    public $() throws ClientProtoclException, IOException 
        CloseableHttpClient client = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet("");
        CloseableHttpResponse response = client.execute(httpGet);
    

或者在你的main函数里抛出

public class $
    public static void main() throws ClientProtoclException, IOException 
        CloseableHttpClient client = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet("");
        CloseableHttpResponse response = client.execute(httpGet);
    

或者是捕获:

public class $
    public static void main() 
        try 
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet("");
            CloseableHttpResponse response = client.execute(httpGet);
        catch(Exception e) 
        
        
    

记得,抛出的异常必须再次抛出throws Exception或捕获,抛出异常只能在方法上定义,而捕获也只能在一个代码块里做(两个大括号之间,但并不包括类的两个大括号)。

参考技术A 异常没有被捕捉。加个try块,捕捉ClientProtocolException就好。 参考技术B 下载一个httpcore的包,就能解决问题了。 参考技术C 这种编译错误,IDE都会自动修正的,自己找一下。追问

并没有修正。。只给出了上图的提示

接口测试—HttpClient

使用HttpClient进行接口测试,所需要使用的相关代码

HttpClient进行接口测试
所需jar包:httpclient.jar、httpcore.jar、commons-logging.jar
Get请求:
//创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//如果发送的是GET请求,创建HttpGet对象
HttpGet httpget = new HttpGet("http://www.baidu.com/");
//执行GET请求
CloseableHttpResponse response = httpClient.execute(httpget);

POST请求:
CloseableHttpClient httpClient = httpClients.createDefault();
//如果发送是POST请求,创建HttpPost对象
HttpPost httppost = new HttpPost("http://localhost:8080/login");
//post请求参数配置
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("name","xxx"));
formparams.add(new BasicNameValuePair("pwd","123456"));
//设置编码格式为utf-8
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams,"UTF-8");
httppost.setEntity(uefEntity);//设置POST请求参数
//使用httpclient的execute方法发送接口请求
CloseableHttpResponse response = new httpClient.execute(httppost);

创建HttpClient对象、response对象操作完毕后,需要进行释放
//释放连接
response.close();
httpClient.close();

常用方法:
1、设置请求和连接超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
//get请求设置请求和传输超时时间
httpget.setConfig(requestConfig);
//post请求设置请求和传输超时时间
httppost.setConfig(requestConfig);

2、获取响应头信息
Header headers[] = response.getAllHeaders();
    for(Header header:headers){
    //响应头信息名称
    System.out.println(header.getName());
    //头信息对应的值
    System.out.println(header.getValue());
    }

3、获取服务器指定头名称的响应头信息
Header Serverheaders[] = response.getHeaders("Server");

4、获取服务器返回状态码,如果等于200就说明请求和响应都成功了
response.getStatusLine().getStatusCode();
常见的错误码:
200 请求成功,且请求的信息包含在响应中
400 服务器未能识别请求
404 请求的资源不在服务器上
500 请求发生了错误

5、根据主机名获取其可能的所有服务器实际ip地址(可能包含多个服务器)
InetAddress[] address = InetAddress.getAllByName("www.baidu.com");
    for(int i = 0; i < address.length; i++){
        System.out.println(address[]);
    }

6、调用HttpResponse的getEntity()方法可获取HttpEntity对象,服务器的响应内容
String returnStr = EntityUtils.toString(response.getEntity());
(常见的服务器返回的响应内容一般有:xml、json格式等)

服务器响应内容解析
1、使用JSONObject插件处理xml、json响应数据
2、需要6个jar包:json-lib.jar、commons-beanutils.jar、commons-collections.jar、ezmorph.jar、commons-logging.jar、commons-logging.jar
xom.jar  把xml的数据转换成json的数据
String xml = "<?xml version=\"1.0\"encoding=\"UTF-8\"?><users><password>123456</password><username>xxx</username></users>";
XMLSerializer xmlSerializer = new XMLSerializer();
//使用xmlSerializer.read()方法可以将xml格式的数据转换成json格式数据
JSON json = xmlSerializer.read(xml);
//转换而成的JSON数据
{"password":"123456","username":"xxx"}

JSON常用解析方法
//将json字符串转换为JSONObject对象
JSONObject jsonObj = JSONObjec.fromObject(json字符串);
//获取name对应的值
jsonObj.getString("name");//取到节点对应的值xxx   jsonObj.getInt(XXX);
//判断json字符串中是否包含name节点,如果存在返回true
jsonObj.has("name");

解析复杂的结果
{
    "returncode":0,
    "message":"",
    "count":2,
    "result":{
        "users":[{"pwd":"123456","name":"xxx"},
            {"pwd":"123456","name":"aaa"}]
        }
    }

//将json字符串转换为JSONObject对象
JSONObject jsonObj = JSONObject.fromObject(json字符串);
//result是一个json对象,使用getJSONObject()来获取
JSONObject resultobj =jsonObj.getJSONObject("return");
//users是数组对象的话可以使用getJSONArray()来获取一个json数组
JSONArray userlist = resultobj.getJSONArray("users");
//可以循环获取数组中的对象元素
for(Object object:userlist){
    JSONObject user = (JSONObject)object;
    User.getString("pwd");
    User.getString("name");
}

以上是关于httpclient调用execute(httpget)报错的主要内容,如果未能解决你的问题,请参考以下文章

java用httpclient 执行到httpclient.execute(request); 这句代码假死不往下执行不报错

httpclient 执行execute方法所耗时间过长,怎么解决

如何使用HttpClient

HttpClient使用笔记

Android HttpClient Cookie

调用接口,解析Json字符串并存入数据库