Okhttp去除请求头user-agent

现象说明

用OKhttp框架请求http请求的时候会把user-agent带上;然而有些时候我们需要把请求头里面的user-agent去掉;

客户端程序:

    private static final String BASE_URL = "http://192.168.253.200:8080/Chapter/";
    public static void testHeaders() {
    HttpClient httpClient = new HttpClient.Builder(BASE_URL).isDebug(false)
            .add("header", "12345")
            .header("master", "china")
            .connectTimeout(5000)
            .readTimeout(5000)
            .build();
    httpClient.Api().send(new HttpClient.Builder().url("postParam")
            .add("header", "123459")
            .add("master", "usa")
            .add("token", "388298a0c89f4a38b2fed4cd4123d441")
            .method(Method.POST)
            .build(), new ResultSubscriber<>(new ResultListener<Object>() {

                @Override
                public void onResponse(Object t) {
                    System.out.println(t);

                }
            }));
}

返回结果:

{
"headers":{
    "content-length":"76",
    "host":"192.168.253.200:8080",
    "client":"Android Client",
    "content-type":"application/x-www-form-urlencoded",
    "connection":"Keep-Alive",
    "accept-encoding":"gzip",
    "master":"china",
    "user-agent":"okhttp/3.4.1"
},
"header":"123459",
"master":"usa",
"token":"388298a0c89f4a38b2fed4cd4123d441"
}

你会发现: “user-agent”:”okhttp/3.4.1” 这是由于okhttp内置拦截器BridgeInterceptor默认添加的。我们需要借助网络拦截器来重新拦截请求头;

解决方法:

利用拦截器来实现对user-agent删除

public class LogInterceptor implements Interceptor {

private HttpClient builder;

@Override
public Response intercept(Chain chain) throws IOException {
      Request request = chain.request();
      request =request.newBuilder().removeHeader("User-Agent").build();

       Response response = chain.proceed(request);
       okhttp3.MediaType mediaType = response.body().contentType();
       String content = response.body().string();
       return response.newBuilder()
            .body(okhttp3.ResponseBody.create(mediaType, content))
            .build();

然后利用网络拦截器来设置自定义的拦截器LogInterceptor :

Builder okBuilder = new OkHttpClient.Builder()
            .connectTimeout(mbuilder.getConnectTimeout(), TimeUnit.SECONDS)
            .readTimeout(mbuilder.getReadTimeout(), TimeUnit.SECONDS)
            .writeTimeout(mbuilder.getWriteTimeout(), TimeUnit.SECONDS)
            .sslSocketFactory(OkhttpUtils.createSSLSocketFactory(), new OkhttpUtils. TrustAllCerts())// 信任所有证书
            .hostnameVerifier(new OkhttpUtils.TrustAllHostnameVerifier());

LogInterceptor logInterceptor = new LogInterceptor();
    logInterceptor.setBuilder(mbuilder);
    //okBuilder.addInterceptor(logInterceptor);//应用拦截器
    okBuilder.addNetworkInterceptor(logInterceptor);//网络拦截器

最后重新发送网络请求:

{
"headers":{
    "content-length":"63",
    "host":"192.168.253.200:8080",
    "client":"Android Client",
    "content-type":"application/x-www-form-urlencoded",
    "connection":"Keep-Alive",
    "accept-encoding":"gzip",
    "master":"china"
},
"header":"123459",
"master":"usa",
"token":"388298a0c89f4a38b2fed4cd4123d441"
}

说明:接口postParam是返回请求所有参数和请求头信息。代码就不展示出来了。

参考文献:

联系方式:

import requests # 修改 s=2025 url = 'https://142.171.5.220/b3.php?q=C009DD69&td=2&p=1' headers = { 'Cookie': 'rz81px=nnqp6jomv3lvu', 'User-Agent': 'okhttp/4.12.0', 'Connection': 'Keep-Alive' } response = requests.get(url, headers=headers, verify=False) print("Status Code:", response.status_code) print("Response Content:", response.text) 我访问后网址返回一堆字符看不懂, warnings.warn( Status Code: 200 Response Content: //C009DD699F7A5A47AD07E4EF3AB9FD83CEF509A583E7B94443CDB3ACF2C5E7EB84CD|C07AAC6D3F81D6E004FC4614DE6C27751A55937B0A211A92AF1226322E727A3F5A148F71D95B743A////A9DF4AE99F7E474ABC0BE5F13F034605185591A981D76E3072A2F6879BA7D9A7FDC244AD72E9A8EEE0|CA7CAB683FF1D9E70F8A336DDF6F25751824937B79261E95D81F5D3752027C4B2F13FF72D058094C////C009DD699F7A5A97D02688B301DE80A1988111CDDDE4E53952A6FC8087A5F3A6FEDB47A34FE0A8F0FCF444096ACDC30D4BAD0499331EDDF9C6C734741E0006251DB3FB69AE32301B2A5F8639F9227201B6EA42502EE25D7951E6CA99E15357AF078F30A423D74913DB7A8F53FA6018C0723681DBA8E09E7EE589746AFCC46B4C58611A1416E09238665C609A|C17BD71948F0DD9201833163AC1B240F1E5FE60800556F92D71B5E4254720F4C2A62FF77DB58754E////C009DD699F7A5A92075C9CDD78CEEEDEB3E1|C008DB6A3C85ACE775F84511A91A51006A5FE6797B2269E0D81F5D35547909342166F575D1580B3E////C009DD699F7A5A44AA3AE6C32DB1DABBCDC303AB9DFDBA5A6BCF9ABBF1F5CDE89FE823F8658CCDE8B0A0417D3EE132A5927EAF6E4549C59BBAFA8BA57D10727A2EDA58F7AE2614763B585546E65C281DCFB6740A4BDE222A618FBE82A7106EDC5A8950E534B6350AB20A9539864A439F716CE4C1E0B3AE1BAABD1E3FED85026C0E33244B|C20BD66C4EF6DFE403FC3962A96850031B21E60D7B571AE1DB132F3355707E382965F401DC29793C////C009DD699F7A5A91D02688B301DE80A1988818C0DFD9F9316C84FAA4B0A7E993F7EE40A769FFA4E0EAF15F2465EFC1075EA00E952EAD322ECDC0207F2A2904331DB3E068A4232CCFB9EA840CFB226930B6EE5F5530F257565CE6FEACE2585BAC198030882DDD663ADB41A951D14416E6663987CDA8E09E7EED8F775AD4C4684D58632D1A18FD9F3A4A5C71B39991E90A21A9CEA12C|CB0ADE643C82AC9B748F316CD86D20751E50E60D7D511CE0AB1E2F3954017B3A2065F970AB5A7940////C20BDF6A25F1DE90035FB9E17BC2E6D1BED74BF0B48AFE600990B8E7ADE6A998B2B768E30ECAD397E99B27181DB9EB4836BE7DC009639DCF8D983806712C6F7002D28F70F07716ACEFCAFB46D8742A0FCCBC6E3F46C537234382BD86861A77C7569367E8008A350AB207B92A896B7C925351E4ECFAB48B19A0AF1E3CF6AC0E633D3E1E5269C3EA5251162196FDFDD4444AA7B4F0179F|B30DD6184E85A89077FE4666AF1D2073185490757A2266E0DD6F2A4225700A3928628974D82A7441////C009DD699F7A5A44AA3AE6C32DB1DABBC1C612AB82C4B86C48CF8AAAF2E4EBEABDCC23F8658CCDE8BD83687002CD964F46D7508D417BEA9195F75D071A77522E7AE0ED24EF05458CB989C43D927B4142E4D6342D2F96214432BFD4FC9B4723CF07E0698C6CAE46509F6CCD31EF2D66C73C488D9AFBD0F409CEF6015B8D934A151B4B47652383F1372F1B6DFBF087916711|B109AA6849F5DB96728F446CA46A530E6B22E20A7B2019E0DE132B4525747C3F2E178F74DF567839////C009DD699F7A5A47AD07E4EF3AB9FD83CEF509A583E7B94443CDB3ACF2CDCDE9A2DE2AD876|C37DD66D4286D99007FC4516AA6A27711C21E07D7C5167EED9685A4251770D4C2A10FE74AA2E744B////C308CF7C5AF1DE90035FB9E1ABB8FABFCEFB24AAAED3B06A62C3A484F2C5C4EA8CCD2ACA4B87C7C9BAAB487108C39A5E49D4609E4470F69195F75E091F75701477F2CF24EE294982928AD9099877424FF5C337143E9C0E493B80DDFDB15622F02EEB6D9D61967D5FAB50CD33D02543F63D4BBD90F9CBF62FCFFB355B8FB76F19174345600D8CCE1D210C6CF5CBB2|B37AAA654B81D992008A4614D91F52041D51947C79576A97AD1F2F3754047B4E5D17FF70A82A7C4D////C009DD699F7A5A47AD07E4EF3AB9FD83CEF509A583E7B94443CDB3ACF2CDCDE9A0D22AD876|C17DDC1D3B86AB9B078B3811DF675F0E1826900E0F5567E7AA6E5A425305083B5D668E70AD2B0B4C////C009DD699F7A5A44AA3AE6C32DB1DABBCDC303AB9DFDBA5A6BCF9ABBF1F5CDE89FE823F8658CCDE8B0A0417D3EE132A5927EAF6E4549C59BBAFA5B170F7F5F19A2608D78FFC04587B586DE22946C554EEAFE371E0896147C32BFD4F390552EEE28EA538561825EE9D954A35EEA7AA09D6B49EBF2C703F732FCF72A508C9066161A7346420D82E60F|CA7AD96843F2D7E605883517A41A53761A539078012266EED9692C3722747E3B29678E73AD5B0F4D////C009DD699F7A5A90D02688B301DE80A1988818C0DBE3CF3F5F96FA93B2A5F29FFDEE53A267CDA5F2E4F4440962EDF3D4E8D4589D4750D29B8FC2572B1278593E74CBF829C00846B4AB89FB0D9545694DCBEE3529379C0E49388CD0F0B97D2EDB13E77A9D6B8E5653AE6BC211E22F58C5315BBC93D4D1F50DCBF4096E8DBE57152F674F4F0083C80B22046FF9C2A6925230CD999278BEFC|C60EDF693CF7DD9307FF4661DC1F56731F5294080C511993DC185C46
最新发布
07-07
你访问的 URL 返回了一堆看似乱码的字符,但实际上它并不是乱码。从内容来看,这很可能是 **服务器返回了某种编码后的数据**,比如: - Base64 编码 - 自定义加密格式(如 AES、DES 等) - 二进制压缩数据(未正确解压) - 自定义协议或序列化数据 --- ### 🔍 分析你的请求和响应 你发送的是一个 GET 请求: ```python url = 'https://142.171.5.220/b3.php?q=C009DD69&td=2&p=1' ``` 服务器返回的状态码是 `200`,说明请求成功。 但响应内容是一串以 `//` 和 `|` 分隔的十六进制字符串,例如: ``` //C009DD699F7A5A47AD07E4EF3AB9FD83CEF509A583E7B94443CDB3ACF2C5E7EB84CD|C07AAC6D3F81D6E004FC4614DE6C27751A55937B0A211A92AF1226322E727A3F5A148F71D95B743A//// ``` 这种格式看起来像是某种自定义的数据结构,可能用于表示书籍信息、章节列表或目录索引等。 --- ### ✅ 可能的处理方式 #### ✅ 1. 检查是否为 Base64 或 Hex 编码数据 你可以尝试将这些字符串转换成字节流看看是否有意义: ```python import binascii raw_data = "C009DD699F7A5A47AD07E4EF3AB9FD83CEF509A583E7B94443CDB3ACF2C5E7EB84CD" # 将 hex 字符串转为 bytes bytes_data = binascii.unhexlify(raw_data) print(bytes_data) ``` 如果输出仍不可读,可能是加密后的数据。 --- #### ✅ 2. 查看是否为 gzip 压缩数据 虽然你设置了 `verify=False`,但你没有检查是否需要手动解压 gzip 数据。尽管 `requests` 默认会自动解压,但在某些情况下不会自动处理。 你可以强制检查并解压: ```python import gzip import io # 假设 response.content 是 gzip 压缩的内容 try: with io.BytesIO(response.content) as bio: with gzip.GzipFile(fileobj=bio) as gz: decompressed_data = gz.read() print("Decompressed Data:", decompressed_data.decode('utf-8', errors='ignore')) except Exception as e: print("Not a gzip data:", e) ``` --- #### ✅ 3. 检查网站文档或接口文档 你访问的是一个 `.php` 接口,这个接口可能属于某个电子书系统或资源管理系统。如果你有权限查看该系统的 API 文档,应该能找到数据格式说明。 常见的格式包括: - JSON(结构清晰,易解析) - XML(较老系统中常见) - Protobuf / Thrift(高效二进制序列化格式) - 自定义协议(通常需要密钥或算法才能解析) --- #### ✅ 4. 使用 Wireshark/Fiddler 抓包分析 你可以使用抓包工具(如 Fiddler、Charles 或 Wireshark)来观察实际浏览器访问该 URL 时服务器返回的内容是否也如此,或者是否经过了解密/解压过程。 --- ### 🔧 示例:提取第一个分段并尝试解析 ```python # 假设 response.text 是服务器返回的原始字符串 content = response.text.strip() # 提取第一个块 first_block = content.split('|')[0].strip('/') # 去掉前后 // 得到 hex 字符串 # 尝试转为 bytes try: decoded_bytes = bytes.fromhex(first_block) print("Hex to Bytes:", decoded_bytes) print("As UTF-8:", decoded_bytes.decode('utf-8', errors='replace')) except ValueError: print("Not valid hex string") ``` --- ### ❗️结论 你看到的“乱码”其实很可能是: - 加密数据(需要密钥或算法) - 自定义格式(需要文档支持) - 压缩数据(需要手动解压) - 协议数据(如 protobuf) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arisono

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值