V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ifane
V2EX  ›  问与答

有熟悉 OKHttp 的同学么。

  •  
  •   ifane · 2016-06-26 10:39:29 +08:00 · 3271 次点击
    这是一个创建于 3072 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这个样子的,我通过 OKHttp 模拟登陆某网站,需要 post 几个参数,其中一个参数是验证码,是中文的,当我尝试 post 过去,提示验证码错误,通过“ httpwatch ” 和 chrome 的开发者工具看了一下该网站登录时的参数, 如图,# 猜测这种情况可能是由于中文的编码问题,导致 post 到服务器时,服务器接受到的数据是乱码所以导致验证码验证错误, 有知道该如何解决的同学么.致谢! 1.png

    2.png

    9 条回复    2016-06-26 16:54:14 +08:00
    faceair
        1
    faceair  
       2016-06-26 12:11:57 +08:00
    大概是 gbk urlencode
    skydiver
        2
    skydiver  
       2016-06-26 12:23:36 +08:00 via iPad
    你都已经猜测了,为什么不改代码试试
    ifane
        3
    ifane  
    OP
       2016-06-26 13:06:23 +08:00
    @faceair 对的。 我通过测试时 gb2312 urlencode ,但是 okhttp 不知道如何设置其 urlencode 为 gb2312 ,请问您知道么
    ifane
        4
    ifane  
    OP
       2016-06-26 13:07:11 +08:00
    @skydiver 主要问题,在于, okhttp 不知道有啥方法可以修改器 urlencode 的编码方式为 gb2312 ,您知道么?
    skydiver
        5
    skydiver  
       2016-06-26 13:25:40 +08:00 via iPad
    @ifane 贴你的代码上来
    ifane
        6
    ifane  
    OP
       2016-06-26 13:47:22 +08:00
    public void loginpost(final String arg1, String arg2, String arg3, final LoginView loginView) {
    RequestBody requestBody = new FormBody.Builder()
    .add("__VIEWSTATE", viewstate)
    .add("__VIEWSTATEGENERATOR", viewstategenerator)
    .add("__EVENTVALIDATION", eventvalidation)
    .add("Account", agr1)
    .add("PWD", arg2)
    .add("CheckCode", arg3)
    .add("cmdok", "")
    .build();
    Request request=new Request.Builder()
    .url(Common.LOGIN_URL)
    .post(requestBody)
    .build();
    client.newCall(request).enqueue(
    new Callback() {
    skydiver
        7
    skydiver  
       2016-06-26 13:57:34 +08:00 via iPad
    看了下 okhttp 代码,貌似都是只考虑了 utf8 ……没法改
    xuhaoyangx
        8
    xuhaoyangx  
       2016-06-26 16:07:16 +08:00
    @ifane 把 okhttp 源码 download 下来吧,自己加一个这个
    ifane
        9
    ifane  
    OP
       2016-06-26 16:54:14 +08:00
    @xuhaoyangx 嗯嗯。 刚刚看了 okhttp 的源码,发现他会自动 urlencode 为 utf8 编码,加了一段代码将其改为 gb2312 编码,测试成功! 好开心,谢谢各位的帮助。致谢!
    方便后来人:
    RequestBody requestBody = new FormBody.Builder()
    .add("__VIEWSTATE", viewstate)
    .add("__VIEWSTATEGENERATOR", viewstategenerator)
    .add("__EVENTVALIDATION", eventvalidation)
    .add("Account", arg1)
    .add("PWD", arg2)
    .add_demo("CheckCode", arg3)//将这个参数传到自定义的函数里面,编码为 gb2312
    .add("cmdok", "")
    .build();

    public Builder add_demo(String name, String value) {
    names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, false, false, true, true));
    try {
    values.add(URLEncoder.encode(value,"gb2312"));
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }

    return this;
    }

    再次感谢大家的帮助,新手上路都是靠大家帮助
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 12:07 · PVG 20:07 · LAX 04:07 · JFK 07:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.