最近有个发送短信的功能,使用的某通的短信接口,调试过程遇到了一点问题:
短信接口主要有以下三点要求:
- 使用post请求
- 采用form表单提交
- 短信内容使用GBK 编码
简单demo如下:
OkHttpClient okHttpClient = new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("SpCode", "***") // 企业编码
.add("LoginName", "***") // 用户名
.add("Password", "***") // 密码
.add("MessageContent", "你有一项编号为123的事务需要处理") // 短信模板内容
.add("UserNumber", "185***351") // 手机号
.add("templateId", "")
.add("SerialNumber", "")
.add("ScheduleTime", "")
.add("f", "1")
.build();
Request request = new Request.Builder()
.url(URL)
.post(formBody)
.build();
try {
Response response = okHttpClient.newCall(request).execute();
String respBody = new String(response.body().bytes(), "gbk");
System.out.println(respBody);
} catch (Exception e){
System.out.println("发送短信失败......");
}
执行上面的代码报错
result=28&description=发送内容与模板不符
因为短信接口要求短信内容为GBK编码,okhttp通过form表单提交时会自动编码,但无法控制编码格式,所以我们方的短信模板与实际时不符的:
使用 addEncoded() 方法修改如下:
OkHttpClient okHttpClient = new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("SpCode", "***")
.add("LoginName", "***")
.add("Password", "***")
.addEncoded("MessageContent", URLEncoder.encode("你有一项编号为123的事务需要处理","gbk")) // 添加已编码的键值对
.add("UserNumber", "185***351")
.add("templateId", "")
.add("SerialNumber", "")
.add("ScheduleTime", "")
.add("f", "1")
.build();
Request request = new Request.Builder()
.url(URL)
.post(formBody)
.build();
try {
Response response = okHttpClient.newCall(request).execute();
String respBody = new String(response.body().bytes(), "gbk");
System.out.println(respBody);
} catch (Exception e) {
System.out.println("发送短信失败......");
}
使用 addEncoded() 方法,添加已经被编码(gbk)的参数的值 ,okhttp将不再对此参数的值进行默认编码,得到的结果正式我们想要的
网友评论