【问题标题】:How to add non-ASCII String in OK-HTTP header?如何在 OK-HTTP 标头中添加非 ASCII 字符串?
【发布时间】:2016-10-05 19:34:24
【问题描述】:

我需要在请求的标头中添加一个 Base64 字符串。现在我的 base64 字符串是 mobileNum+pin 。这就是我生成编码字符串的方式:

public static String getAuthentication(String userName,String spin)
{
    String userCredentials = userName+":"+spin;
    String base64=null;
    try
    {
        byte[] data = userCredentials.getBytes("UTF-8");
        base64 = Base64.encodeToString(data, Base64.DEFAULT);
    }
    catch (UnsupportedEncodingException e){}

    String basicAuth = "Basic "+ new String(base64);

    return basicAuth;
}

而且,现在当我尝试从 Ok-HTTP 发出请求时,

Request request = new Request.Builder()
            .url(url+sp.getString("MOB",""))
            .get()
            .addHeader("xkey", ""+Auth.getApiKey())
            .addHeader("authorization",""+Auth.getAuthentication(sp.getString("MOB",""),sp.getString("SPIN","")))
            .addHeader("cache-control", "no-cache")
            .build();

它抛出异常,说:

 java.lang.IllegalArgumentException: Unexpected char 0x0a at 30 in authorization value: Basic OTE4MTExODExNjYwOjEyMzQ=

                  at okhttp3.Headers$Builder.checkNameAndValue(Headers.java:320)
                  at okhttp3.Headers$Builder.add(Headers.java:270)
                  at okhttp3.Request$Builder.addHeader(Request.java:175)
                  at com.shreybank.shrey.activities.RegisterActivity.getCredentials(RegisterActivity.java:244)
                  at com.shreybank.shrey.activities.RegisterActivity.access$900(RegisterActivity.java:38)
                  at com.shreybank.shrey.activities.RegisterActivity$4.onResponse(RegisterActivity.java:229)
                  at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
                  at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                  at java.lang.Thread.run(Thread.java:818)

解决此问题的最佳方法是什么?

【问题讨论】:

  • 你能编辑我的答案吗?我不使用 ok3http-lib,因此我总是陷入拼写错误——正如你所提到的!最好的方法是您编辑我的答案,以便其他用户可以向您学习!

标签: java android base64 okhttp


【解决方案1】:

Basic OTE4MTExODExNjYwOjEyMzQ=
012345678901234567890123456789

你的字符串末尾有一些东西!

0xa = LF (Line Feed)

您可以在堆栈跟踪中看到换行符!

所以你的值末尾有一个无效的换行符。我看不到任何将添加它的代码。不要多次使用addHeader(...),而是直接将值添加到标题中。

好的,如何正确使用它:

request request = new Request.Builder()
        .url(url+sp.getString("MOB",""))
        .get()
        .addHeader(
            new Headers.Builder().add("xkey", ""+Auth.getApiKey())
           .add("authorization",""+Auth.getAuthentication(sp.getString("MOB",""),sp.getString("SPIN","")))
           .add("cache-control", "no-cache")).build())
        .build();

好的,这段代码测试过,它只是解释了你应该怎么做:使用一个新的标题生成器,添加键/值,然后通过调用build()创建标题

看看HeaderBuilder,看看HeaderBuilder

【讨论】:

  • 是的,看起来您不应添加多个标题! (使用 Header.add(..) )代替
  • 感谢您的回答!但无法解析 HeaderFactory()
  • 非常感谢你清除了这个问题 - 我正在做一个项目,它主要是关于工厂的,所以我完全心不在焉......
  • 呃,不使用该库时,编写正确的代码真的很困难^^
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2011-07-22
相关资源
最近更新 更多