如何在OK-HTTP标头中添加非ASCII字符串?

OBX*_*OBX 5 java base64 android okhttp

我需要在我的请求的标题中添加一个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;
}
Run Code Online (Sandbox Code Playgroud)

而且,现在当我尝试从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();
Run Code Online (Sandbox Code Playgroud)

抛出异常,说:

 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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ank 0

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();
Run Code Online (Sandbox Code Playgroud)

好的,此代码未经测试,它只是解释了您应该如何执行此操作:使用新的标头构建器,添加键/值,然后通过调用创建标头build()

看看HeaderBuilder,看看HeaderBuilder