1.框架介绍
okHttp3 是一个基于Http协议的网络开源框架,是由 square 公司开发。 在以后的项目开发中,不推荐使用commons-httpclient,httpclient,推荐使用okhttp,feigh。
原因:1.square公司,Netflix公司都是技术实力很强大的公司,他们开源了很多非常好用的框架;2.这两个框架使用人数非常多,网络上资料也是非常丰富的。
2.发送post请求示例
public void sendHttpPost() throws Exception {
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = RequestBody.create(JSON, JsonUtils.toJSON(paramObject));
//创建一个请求对象
Request request = new Request.Builder().url(host).
addHeader("Content-Type", "application/json;charset=UTF-8").
addHeader("User-Agent", source).
addHeader("version-type", versionType).
addHeader("-authtoken", authentication).
addHeader("-appid", appid).
addHeader("-version", version).
addHeader("-version-code", versionCode).
addHeader("rom-display", romDisplay).
addHeader("Content-Type", "application/json;charset=UTF-8").
post(requestBody).build();
Response response = okHttpClient.newCall(request).execute();
//判断请求是否成功
if (response.isSuccessful()) {
logger.info("响应成功:{}",IOUtils.toString(response.body().byteStream()));
}else {
logger.info("响应失败");
}
}
3.发送get请求示例
private static void sendGet() throws Exception {
String url = "https://www.baidu.com/";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
System.out.println(response.body().string());
}
4.需要注意的问题
在http头部,传递中文的时候,会出现乱码。比如: addHeader("phone-model","苹果手机)。这时候运行,就会报错。报错原因是:okhttp框架会对头部的键值对,进行强制校验,校验不通过就抛异常。
部分源码如下:
private void checkNameAndValue(String name, String value) {
if (name == null) throw new NullPointerException("name == null");
if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
for (int i = 0, length = name.length(); i < length; i++) {
char c = name.charAt(i);
if (c <= '\u0020' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
}
}
if (value == null) throw new NullPointerException("value for name " + name + " == null");
for (int i = 0, length = value.length(); i < length; i++) {
char c = value.charAt(i);
if ((c <= '\u001f' && c != '\t') || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value));
}
}
}
解决方案:可以对可能出现的中文值进行统一编码,然后解码,也可以统一放到框架中进行编解码
method.setRequestHeader("phone-model",URLEncoder.encode(phoneModel,"utf-8"));
model =URLDecoder.decode(reqHead.getPhoneModel(), "utf-8");