OkHttp3 添加Authorization 异常 Unexpected char 0x0a at 42 in Authorization value 解决

异常记录

导致错误:

2020-09-27 11:00:55.027 29224-29224/cn.sh.changxing.smec.dt E/AndroidRuntime: FATAL EXCEPTION: main
    Process: cn.sh.changxing.smec.dt, PID: 29224
    java.lang.IllegalArgumentException: Unexpected char 0x0a at 42 in Authorization value: Basic SjhERSFtRzNBRlVhS1FKNToyMDIwMDkyNw==
    
        at okhttp3.Headers$Builder.checkNameAndValue(Headers.java:352)
        at okhttp3.Headers$Builder.set(Headers.java:332)
        at okhttp3.Request$Builder.header(Request.java:184)

错误分析:第42处 出现 0x0a 字符!  0x0a:表示换行符。 好吧,在结尾处有换行符导致的异常(但打印的字符串并看不出来.....)

异常写法:

    private String getToken() {
        try {
            String salt = SPUtils.getInstance(MyApplication.getInstance()).getString(SPUtils.SP_IOT_BASIC_SALT);
            if (!TextUtils.isEmpty(salt)) {
                String str = salt + ":" + getSystemDate();
                String token = "Basic " + Base64.encodeToString(str.getBytes(), Base64.DEFAULT);
                Log.d(TAG, "getToken: str = " + str + "  token = " + token);
                return token;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

修改处:

String token = "Basic " + Base64.encodeToString(str.getBytes(), Base64.DEFAULT).replaceAll("\r|\n", "");

转码后,去除字符串中所有的换行符!

 

### 使用 JavaOkHttp3 调用 DeepSeek API 的 Controller 接口 为了实现这一目标,可以构建一个 RESTful 控制器来处理 HTTP 请求并利用 OkHttp3 库执行对外部 API 的调用。下面是一个具体的例子展示如何创建 `UserController` 来注册新用户,并通过 OkHttp3 发送 POST 请求给 DeepSeek API。 #### 创建 Maven 或 Gradle 项目依赖项 确保项目的构建文件中包含了必要的库支持: 对于 Maven,在 pom.xml 文件内加入如下依赖: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- OkHttp3 Client Library --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.0</version> </dependency> <!-- Jackson Databind for JSON processing --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- Lombok to reduce boilerplate code --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> ``` #### 编写控制器类 接下来定义 `UserController.java` 类用于接收客户端提交的数据并向外部 API 提交请求: ```java @RestController @RequestMapping("/api/user") public class UserController { private static final String DEEPSEEK_API_URL = "https://api.deepseek.com/v1/register"; private static final String API_KEY = System.getenv("DEEPSEEK_API_KEY"); // 建议从环境变量读取API key @PostMapping("/register") public ResponseEntity<String> registerUser(@Valid @RequestBody UserRegisterDTO dto) { OkHttpClient client = new OkHttpClient(); try { JSONObject jsonBody = new JSONObject() .put("username", dto.getUsername()) .put("email", dto.getEmail()) .put("password", dto.getPassword()); RequestBody body = RequestBody.create( MediaType.parse("application/json"), jsonBody.toString() ); Request request = new Request.Builder() .url(DEEPSEEK_API_URL) .post(body) .addHeader("Authorization", "Bearer " + API_KEY) .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); return ResponseEntity.status(response.code()).body(response.body().string()); } catch (Exception e) { return ResponseEntity.badRequest().body(e.getMessage()); } } } ``` 此代码片段展示了如何设置带有必要头信息(如授权令牌)的 HTTP 客户端实例以及发送包含用户数据的有效负载至指定 URL 地址的过程[^1]。 此外还实现了基本错误处理逻辑以应对可能发生的异常情况,比如网络连接失败或是服务器返回非成功的状态码[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值