用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 中看不到这一点,因为它在幕后为您编码空间。

更好的方法是使用URLComponentsURLQueryItem 并使用条件展开

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插件获取数组时出现“非法字符串偏移”错误

maven编译工程时出现非法字符: 65279错误

Docker Jenkins Image - curl:(3)在 URL 中发现非法字符

JMeter - Java.net.URISyntaxException: 路径中index处的非法字符

添加底部导航活动后编译错误(非法字符)

url的非法字符都有哪些