当URL编码遇到String.format

Java中在使用String.format时会遇到MissingFormatArgumentException等异常,发现是针对编码后的URL进行格式化导致的。

直接上代码,比如我们要进行下面的格式化:

String url = "http://www.csdn.net/?arg1=(a,b)&arg2=%d";
String s = String.format(url, 10);
System.out.println(s);

其输出结果是没有问题的

http://www.csdn.net/?arg1=(a,b)&arg2=10

但是如果我们对上面的url进行编码,结果就会出现问题

String domain = "http://www.csdn.net/?";
String arg = "arg1=(a,b)&arg2=%d";
String url = domain + URLEncoder.encode(arg, "UTF-8");
String s = String.format(url, 10);
System.out.println(s);
这段代码会抛出异常:

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'D'

问题出现的原因就在于编码这一行了,打印其输出结果是这样的:

http://www.csdn.net/?arg1%3D%28a%2Cb%29%26arg2%3D%25d
程序在解析格式化标签的时候将%3D解释为一个参数标记,所以会出错。


我们再看下面这一句:

String arg = "%darg1(a)&arg2%d";
String url =  URLEncoder.encode(arg, "UTF-8");
System.out.println(url);
String s = String.format(url, 10);
System.out.println(s);

其结果如下:

%25darg1%28a%29%26arg2%25d
Exception in thread "main" java.util.MissingFormatArgumentException: Format specifier '%28a'
这里是因为第一个%25d被识别成整数标记,紧接着解析后面的%28a时,由于参数列表没有更多的参数,所以解析程序认为参数不足(MissArgument)而抛出异常。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码主要功能是将一个消息推送到指定的聚会系统中。以下是代码的详细解释: 1. 导入所需的Java包: ``` import java.io.Console; import response; import request; import http; import java.io.File; import java.io.IOException; import java.nio.file.Files; import com.alibaba.fastjson.JSONObject; import org.apache.commons.codec.binary.Base64; import java.net.URLEncoder; ``` 2. 定义聚会系统的API地址: ``` var juhuiAPIUrl = "http://10.210.26.65:8080/juhuiapi/plugins/notification_service/push_notification?resource=juhui&sysCode=LCP&empNos=%s&msgContent=%s" ``` 其中,`%s` 是用于参数化的占位符,后面会用具体的值替换它们。 3. 定义要推送的消息内容: ``` let juhuiParams = { "type": "web", "host": "com.foxconn.lcp", "port": "", "path": "", "title": "LCP", "subTitle": item, "innerurl": aPIUrl, "outterurl": "", "param": {} } ``` 这里使用了一个JSON对象来表示消息的各个属性,包括类型、主机、端口、路径、标题、副标题、内部URL、外部URL和参数等。 4. 对消息进行Base64编码URL编码: ``` String base64URLSafeString = Base64.encodeBase64URLSafeString(JSONObject.toJSONString(juhuiParams).getBytes("utf-8")); String base64UrlencodeMsg = URLEncoder.encode(base64URLSafeString, "utf-8"); ``` 这里使用了Apache Commons Codec库来进行Base64编码,并使用Java的URLEncoder类进行URL编码。 5. 发送HTTP POST请求,并获取响应: ``` let juhuiResponse = http.connect(String.format(juhuiAPIUrl, userAccount, base64UrlencodeMsg)).post().getBody(); ``` 这里使用了http库提供的connect方法来连接指定的聚会系统API地址,使用Java的String.format方法将`%s`占位符替换为具体的值,然后使用post方法发送HTTP POST请求,并使用getBody方法获取响应内容。 总的来说,这段代码实现了将一条消息推送到指定的聚会系统中的功能,其中使用了Java的HTTP请求库、JSON编解码库、Base64编解码库和URL编解码库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值