OkHttp是安卓上常用的网络请求框架,不止可以发送http请求,还可以发送socket请求等。
官网地址:https://square.github.io/okhttp/
1、在build.gradle中引入依赖implementation("com.squareup.okhttp3:okhttp:4.10.0")
2、在AndroidManifest.xml中添加网络请求权限<uses-permission android:name="android.permission.INTERNET"/>
创建httpClient
OkHttpClient okHttpClient = new OkHttpClient();
安卓程序中的网络请求必须异步处理,所以另外启动了一个线程
public void doGetSync(View view) {
new Thread(() -> {
Request request = new Request.Builder().url("https://www.httpbin.org/get?name=test&b=123").build();
try {
Response response = okHttpClient.newCall(request).execute();
Log.d(TAG, "doGetSync: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
调用enqueue()方法,传入回调函数
public void doGetAsync(View view) {
Request request = new Request.Builder().url("https://www.httpbin.org/get?name=test&b=123").build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()) {
Log.d(TAG, "doGetAsync: " + response.body().string());
}
}
});
}
post请求必须传入一个body参数,这里传入一个formBody
public void doPostSync(View view) {
new Thread(() -> {
FormBody formBody = new FormBody.Builder().add("name", "test").add("b", "123").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody).build();
try {
Response response = okHttpClient.newCall(request).execute();
Log.d(TAG, "doPostSync: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
调用enqueue()方法,传入回调函数
public void doPostAsync(View view) {
FormBody formBody = new FormBody.Builder().add("name", "test").add("b", "123").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()) {
Log.d(TAG, "doPostAsync: " + response.body().string());
}
}
});
}
OkHttp中有两种添加拦截器的方法
public class InterceptorTest {
@Test
public void test() throws IOException {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(chain -> {
System.out.println("---Interceptor拦截器---");
Request request = chain.request().newBuilder()
.addHeader("os", "android")
.addHeader("version", "1.0").build();
return chain.proceed(request);
})
.addNetworkInterceptor(chain -> {
System.out.println("---NetworkInterceptor拦截器---");
String os = chain.request().header("os");
System.out.println("os = " + os);
return chain.proceed(chain.request());
}).build();
Request request = new Request.Builder().url("https://www.httpbin.org/get?name=test&b=123").build();
Response response = httpClient.newCall(request).execute();
System.out.println("response = " + response.body().string());
}
}
打印输入内容:
---Interceptor拦截器---
---NetworkInterceptor拦截器---
os = android
response = {
"args": {
"name": "test",
"b": "123"
},
"headers": {
"Accept-Encoding": "gzip",
"Host": "www.httpbin.org",
"Os": "android",
"User-Agent": "okhttp/4.10.0",
"Version": "1.0",
"X-Amzn-Trace-Id": "Root=1-636b6373-18b0b24d6539a83e489ab0c4"
},
"origin": "124.78.136.197",
"url": "https://www.httpbin.org/get?name=test&b=123"
}
在某些网站中请求需要携带cookie,在OKHttp中提供了较好的支持
通过cookieJar方法提供cookie支持逻辑处理
本示例代码使用www.wanandroid.com的开放接口,可以自行去注册一个账号用于测试
public class CookieTest {
@Test
public void test() throws IOException {
Map<String, List<Cookie>> cookies = new HashMap<>();
OkHttpClient client = new OkHttpClient.Builder().cookieJar(new CookieJar() {
@Override
public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
cookies.put(httpUrl.host(), list);
}
@NonNull
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
List<Cookie> list = cookies.get(httpUrl.host());
return list == null ? new ArrayList<>() : list;
}
}).build();
// 登录接口
FormBody formBody = new FormBody.Builder()
.add("username", "xxxxx")
.add("password", "xxxxx")
.build();
Request request = new Request.Builder()
.url("https://www.wanandroid.com/user/login")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println("response1 = " + response.body().string());
// 登录成功后,加载收藏列表
Request request1 = new Request.Builder()
.url("https://www.wanandroid.com/lg/collect/list/0/json")
.build();
response = client.newCall(request1).execute();
System.out.println("response2 = " + response.body().string());
}
}
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
我正在使用devise登录omniauth,authid。当用户登录时,我得到user_info:name:RiccardoTacconilast_name:Tacconiemail:email@gmail.comfirst_name:Riccardouid:https://www.google.com/accounts/o8/id?id=xxxxxxxxxprovider:google_apps我找到了一个插件:http://stakeventures.com/articles/2009/10/06/portable-contacts-in-ruby获取Google通讯录。我只需要使