用java获取URL路径时出现非法字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java获取URL路径时出现非法字符相关的知识,希望对你有一定的参考价值。
真正路径中没有这个的!
经常会在浏览器的地址栏里看到这样的字符串%E6%96%87%E6%A1%A3这就是被编码后的字符串,下面就讨论一下java 的url编码与解码问题
java.net.URLDecoder.decode(String s,String enc);
将application/x-www-form-urlencoded字符串转换成普通字符串。
java.net.URLEncoder.decode(String s,String enc);
将普通字符串转换成application/x-www-form-urlencoded字符串
代码示例:
import java.net.URLDecoder;
import java.net.URLEncoder;
public class URLDecoderTest
public static void main(String[] args) throws Exception
//将application/x-www-form-urlencoded字符串
//转换成普通字符串
//必须强调的是编码方式必须正确,如baidu的是gb2312,而google的是UTF-8
String keyWord = URLDecoder.decode("%E6%96%87%E6%A1%A3", "gb2312");
System.out.println(keyWord);
//将普通字符串转换成
//application/x-www-form-urlencoded字符串
//必须强调的是编码方式必须正确,如baidu的是gb2312,而google的是UTF-8
String urlStr = URLEncoder.encode("文档", "gb2312");
System.out.println(urlStr);
参考技术A %20 表示空格。
这是什么原因出现了%,这是URL编码的问题麻,这个路径已经被编码过了,所以要解码,
只要在程序中加一句:
testtext = java.net.URLDecoder.decode(testtext, "UTF-8");本回答被提问者采纳 参考技术B %20 就是16进制的20也就是十进制的32,也就是空格的ASCII的值,这里你看到的%20就表示的是空格 参考技术C 这个应该不属于非法字条吧,这应该是转换过来的unicode 编码还是Ascll 二码 参考技术D 你发现一个问题没,出现空格的地方才会有这些所谓的非法字符,由于java的特性,安装软件时不要安装在(1、有空格的路径下,2、有中文的路径下)
获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误
【中文标题】获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误【英文标题】:Get request doesn't get executed in swift, getting nil value error where URL is passed in the request 【发布时间】:2021-08-24 08:31:33 【问题描述】:我正在尝试在我的应用程序中添加一个 GET 请求。 值或最终 url 字符串在我的 sURL 变量中正确流动。但仍然在执行此代码时,我在行 - “var request = URLRequest(url: URL(string: sUrl)!)”处得到“Found nil error”
请帮忙。
我的代码 -
class AllStickerService
static let allStickerInstance: AllStickerService = AllStickerService()
var delegateAllSticker: AllStickerProtocol!
func fetchAllSticker(category: String, APITokenString: String)
var sUrl = "http://xyzabc.com/api/stickers"
let params = ["category": category]
var sParams = ""
for (key,value) in params
sParams += key + "=" + value
print("\(key), \(value)")
if !sParams.isEmpty
sParams = "?" + sParams
sUrl = sUrl + sParams
var request = URLRequest(url: URL(string: sUrl)!)
print(request)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("Bearer "+APITokenString, forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request) (data, response, error) in
if (response as? HTTPURLResponse) != nil
if let httpResponse = response as? HTTPURLResponse
print("statusCode: \(httpResponse.statusCode)")
print(httpResponse)
if let data = data
do
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else return
print(json)
catch
print("Error\(error)")
.resume()
【问题讨论】:
不要强制解包,也不要使用字符串连接,使用URLComponents
创建您的 URL。字符串连接不会对参数中的空间进行百分比编码。
启用应用传输?
GET 请求也不需要内容类型标头。
@ElTomato 它已经设置为“是”
【参考方案1】:
强制展开很少是一个好主意。要么使用字符串连接来创建 URL;要么除了潜在的安全问题外,您还必须担心 url 编码之类的问题,这就是您的问题。
您的category
参数值有一个空格,需要将其编码为 %20,但您不这样做会导致 URL 字符串无效。您在 Postman 中看不到这一点,因为它在幕后为您编码空间。
更好的方法是使用URLComponents
、URLQueryItem
并使用条件展开
func fetchAllSticker(category: String, APITokenString: String)
var sUrl = "http://xyzabc.com/api/stickers"
let params = URLQueryItem(name:"category", value: category)
if var urlComponents = URLComponents(string:"http://xyzabc.com/api/stickers")
urlComponents.queryItems = params
if let url = urlComponents.url
var request = URLRequest(url: url)
...
我还建议您考虑使用 Decodable
来处理您的 JSON 响应,而不是 JSONSerialization
【讨论】:
@Pawlw11 感谢您的意见。你的回答奏效了。以上是关于用java获取URL路径时出现非法字符的主要内容,如果未能解决你的问题,请参考以下文章
为dataTable jquery插件获取数组时出现“非法字符串偏移”错误
Docker Jenkins Image - curl:(3)在 URL 中发现非法字符