HttpPost post=new HttpPost(url)
HttpResponse response = null
JSONArray array=null
try {
//getHttpConnectionManager().getParams().setConnectionTimeout(11)
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000)
response = httpClient.execute(post)//发送请求
int statusCode=response.getStatusLine().getStatusCode()
System.out.println("连接状态:"+statusCode)
if (statusCode>= 200&&statusCode<400) {//判断请求是否成功
HttpEntity entity = response.getEntity()
String out = EntityUtils.toString(entity, "GBK")
//out=Base64.encodeToString(out.getBytes("GBK") ,Base64.DEFAULT)
System.out.println("返回结果:"+out)
array = new JSONArray(out)
}
} catch (Exception e) {
e.printStackTrace()
}
System.out.println("array"+array)
implementation ‘com.squareup.okhttp3:okhttp:3.4.1’1、发送Get请求:
下面我们来看一下OkHttp的具体用法,首先需要创建一个OkHttpClient的实例,如下所示:
OkHttpClient client = new OkHttpClient()
接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:
Request request = new Request.Builder().build()
当然,上述代码只是创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址,如下所示:
Request request = new Request.Builder().url(“http://www.baidu.com”).build()
之后调用OkHttpClient的newCal1()方法来创建一个Cal1对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,写法如下:
Response response = client.newCall(request).execute()
其中Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:
String responseData = response.body().string()
2、发送Post请求
OkHttpClient client = new OkHttpClient()
RequestBody requestBody = new FormBody.Builder()
.add("username","admin")
.add("password","123456")
.build()
然后在Request.Builder中调用一下post()方法,并将RequestBody对象传人:
Request request = new Request.Builder()
.url("http://www.baidu.com")
·post(requestBody)
.build()
Response response = client.newCall(request).execute()
String responseData = response.body().string()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GSON解析返回数据
导包:implementation ‘com.google.code.gson:gson:2.7’ //用来解析后面okhttp请求服务器后返回的json数据
比如说一段JSON格式的数据如下所示:{“name”:“Tom”,“age”:20}
那我们就可以定义一个Person类,并加入name和age这两个字段,然后只需简单地调用
如下代码就可以将JSON数据自动解析成一个Person对象了:
Gson gson = new Gson()
Person person = gson.fromJson(jsonData, Person.class)
如果需要解析的是一段JSON数组会稍微麻烦一点,我们需要借助TypeToken将期望解析成
的数据类型传入到fromJson()方法中,如下所示:
List people = gson.fromJson(jsonData, new TypeToken<List>(){}.getType())
常见报错
1、还是在调用远程接口,进行网络通信的时候,报了如下错误:
W/System.err: java.net.UnknownServiceException:
CLEARTEXT communication to xxx.xxx.xxx not permitted by network security policy
原因:
为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。
在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。
(1)改用https请求
(2)targetSdkVersion 降到27以下
(3)在 application 元素中添加:
android:usesCleartextTraffic=”true”
![image.png](https://img-blog.csdnimg.cn/img_convert/458d6d282435b0fbcbee0b3c96449a0e.png#clientId=uc5f1ba96-dc98-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=246&id=u1adc76b0&margin=[object Object]&name=image.png&originHeight=306&originWidth=599&originalType=url&ratio=1&rotation=0&showTitle=false&size=36156&status=done&style=none&taskId=u740598ac-8510-4d4c-9488-4ad0a9d8f77&title=&width=481)
2、报错java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.webviewapplication/com.example.webviewapplication.OkHttpActivity}: android.os.NetworkOnMainThreadException在主线程中的网络异常错误
public class OkHttpActivity extends AppCompatActivity {
private TextView textView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ok_http)
textView = findViewById(R.id.response_text01)
//直接在下面这种情况运行会报错,因为 在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,
//运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(Aplication Not Response)异常,Android这个设
//计是为了防止网络请求时间过长而导致界面假死的情况发生。
//我们这里的代码是MainActivity跳转过来的,依然还是在主线程中
OkHttpClient client = new OkHttpClient()
Request request = new Request.Builder().url("https://www.baidu.com").build()
try {
Response response = client.newCall(request).execute()
String respnseData = response.body().string()
System.out.println("结果是"+respnseData)
} catch (IOException e) {
e.printStackTrace()
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)