http Request-Line

本文讨论了使用JDK获取百度搜索结果时遇到的问题,即URL编码导致的请求参数异常,通过使用java.net.URLEncoder进行编码解决了该问题。


以下代码通过jdk自带的HttpURLConnection获取百度对关键字"angry brids"的搜索结果。

        URL baiduSearch = new URL("http://www.baidu.com/s?wd=angry birds");
        HttpURLConnection connection = (HttpURLConnection) baiduSearch.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        ... ...
        connection.setRequestProperty("Host", "www.baidu.com");
        connection.getOutputStream().flush();
        InputStream inputStream = connection.getInputStream();

但是用wireshark抓包发现http请求的参数不符合预期。
请求行(Request-Line)是POST /s?wd=angry bird HTTP/1.1,按照RFC2616的定义
   Request-Line = Method SP Request-URI SP HTTP-Version CRLF
预期的结果是

Method Request-URI HTTP-Version
POST /s?wd=angry bird HTTP/1.1

而实际由于查询参数"angry birds"中的空格,请求是

Method Request-URI HTTP-Version
POST /s?wd=angry bird HTTP/1.1

见下图红框内容


因此需要在构造url的时候对path "s?wd=angry birds"部分做编码,可以使用jdk的java.net.URLEncoder。


<think>好的,我现在需要帮助用户测试他们的CORS配置是否正确。用户提到想使用curl命令,特别是用-I和-X OPTIONS来测试。首先,我得回忆一下CORS的基本机制。根据引用[3],CORS通过HTTP头来允许不同域的访问,而预检请求(OPTIONS)是关键部分。用户的问题可能出在预检请求的响应头是否正确设置,比如缺少Access-Control-Allow-Origin等。 用户提供的示例报错显示预检请求失败,因为没有正确的头信息[^2]。所以,测试的时候需要模拟OPTIONS请求,并检查返回的头是否包含必要的字段,比如Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers。 接下来,我需要确定正确的curl命令格式。用户提到使用-I和-X OPTIONS。-I是只获取头部信息,而-X OPTIONS指定使用OPTIONS方法。但根据引用[1],预检请求需要包含Origin、Access-Control-Request-Method和可能的Access-Control-Request-Headers。因此,curl命令需要设置这些请求头。 例如,正确的命令应该类似于: curl -X OPTIONS -H "Origin: https://a.example.com" -H "Access-Control-Request-Method: DELETE" -H "Access-Control-Request-Headers: X-Custom-Header" --head https://target.site.com 这里,用户可能需要替换Origin、方法和头信息为实际的值。测试后,用户需要检查响应头中的Access-Control-Allow-Origin是否包含他们的域名,方法是否被允许,以及请求头是否被接受。 另外,用户可能容易犯的错误是忘记添加必要的请求头,或者服务器配置没有正确处理OPTIONS请求。比如,如果服务器没有返回Access-Control-Allow-Origin,或者返回的域名不匹配,就会导致CORS失败。此外,某些服务器可能需要额外的配置来响应OPTIONS方法,比如在API网关或后端代码中显式处理。 总结步骤:构造包含必要请求头的OPTIONS请求,发送到目标URL,然后检查响应头是否符合CORS要求。同时,提醒用户注意实际环境中的变量,如正确的域名、方法和头信息。</think>### 如何通过curl测试CORS配置 #### 1. 发送预检请求(OPTIONS) 使用`curl`模拟浏览器预检请求,需要包含以下关键参数: ```bash curl -I -X OPTIONS \ -H "Origin: https://你的源站域名" \ -H "Access-Control-Request-Method: 实际请求方法" \ -H "Access-Control-Request-Headers: 自定义请求头名称" \ "https://目标网站" ``` 示例(测试DELETE方法和X-API-Token头): ```bash curl -I -X OPTIONS \ -H "Origin: https://a.example.com" \ -H "Access-Control-Request-Method: DELETE" \ -H "Access-Control-Request-Headers: X-API-Token" \ "https://b.example.com/api/data" ``` #### 2. 验证响应头 成功响应应包含以下关键头信息: ``` Access-Control-Allow-Origin: https://a.example.com # 必须与请求Origin匹配[^3] Access-Control-Allow-Methods: DELETE # 必须包含请求方法[^1] Access-Control-Allow-Headers: X-API-Token # 必须包含自定义请求头 Access-Control-Max-Age: 86400 # 预检缓存时间(可选) ``` #### 3. 常见错误排查 - 错误1:未返回`Access-Control-Allow-Origin` ```bash curl -I -X OPTIONS https://b.example.com # 响应可能缺少必要CORS头 ``` - 错误2:允许的源不匹配 ```bash curl -I -X OPTIONS -H "Origin: https://c.example.com" https://b.example.com # 响应头Access-Control-Allow-Origin应为https://c.example.com或* ``` #### 4. 完整测试流程 ```bash # 步骤1:发送预检请求 curl -v -X OPTIONS \ -H "Origin: https://a.example.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type,Authorization" \ "https://b.example.com/api" # 步骤2:检查响应头是否包含 # > Access-Control-Allow-Origin: https://a.example.com # > Access-Control-Allow-Methods: POST # > Access-Control-Allow-Headers: Content-Type,Authorization ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值