怎么根据一个Url获取服务器返回的数据

怎么根据一个Url获取服务器返回的数据,第1张

HttpClient httpClient = new DefaultHttpClient()

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/573564.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-04
下一篇2023-07-04

发表评论

登录后才能评论

评论列表(0条)

    保存