最近在爬虫的过程中,访问微软必应词典接口时,遇到了 Error 400. The request has an invalid header name 的错误。
请求头文件如下:

Host: cn.bing.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
TE: Trailers

构建http请求头:

static Header[] getHeader(String headersPath) {
		//fileToLines :工具类,把文件以行字符串为单位,读到一个list中
		ArrayList<String> hs=FileUtils.fileToLines(new File(headersPath));
		//org.apache.http.Header;
		Header[] headers=new Header[hs.size()];
		for (int i=0;i<headers.length;i++) {
			String key=hs.get(i).split(":",2)[0];
			String value=hs.get(i).split(":",2)[1];
			headers[i]=new BasicHeader(key, value);
		return headers;

发送请求:

public void doGet()throws Exception{
	CloseableHttpClient httpClient = HttpClients.createDefault();
        String url = "https://cn.bing.com/dict/search?q=happily";
        //Get方法
        HttpGet httpGet = new HttpGet(url);
        //配置各种响应时间
        RequestConfig requestConfig = RequestConfig.custom()  
                .setConnectTimeout(3000).setConnectionRequestTimeout(1000)  
                .setSocketTimeout(5000).build();  
        httpGet.setConfig(requestConfig); 
		//调用上面getHeader方法
        httpGet.setHeaders(getHeader("D:\\desktop\\新建文本文档.txt"));
        //执行请求
		CloseableHttpResponse httpResponse=httpClient.execute(httpGet);
		int statusCode = httpResponse.getStatusLine().getStatusCode();//状态码
		System.out.println(statusCode);
		//获取响应内容
		String content= EntityUtils.toString(httpResponse.getEntity(), "utf-8");
		System.out.println(content);

执行结果如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Bad Request</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Bad Request - Invalid Header</h2> <hr><p>HTTP Error 400. The request has an invalid header name.</p> </BODY></HTML>

提示请求包含不合法请求头。
我寻思着请求头都合法啊,还又挨个去看了D:\desktop\新建文本文档.txt,我文件里面的请求头。
然后就想,是不是把请求头读到list中的fileToLines方法出问题了,导致设置的请求头和文件里的请求头不一样

查看fileToLines方法:

public static Collection<String> fileToLines(String fileName,Collection<String>list){
		try (BufferedReader br=new BufferedReader(new FileReader(fileName))){
			String info;
			while((info=br.readLine())!=null) {
				list.add(info.replaceAll("\\s*", ""));
		} catch (Exception e) {
		return list;

看到方法的那一刻,我立马明白了!replaceAll("\s", “”)把所有空格换行什么的,都整没了!
导致请求头中的:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
变成了:
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:69.0)Gecko/20100101Firefox/69.0
所有空格都没了,这不是合法的UA。
想必是以前出于某种需求,改了工具类的fileToLines方法。
教训:莫要在抽象出来的工具类中添加特定需求代码!如:replaceAll("\s", “”)

至此问题解决!

今天遇到这个问题,然后百度,必应,google,都找遍了,看到很多写这个问题的博客,说实在的,真的没有一点帮助,于是自己花了2个小时自己找原因。原因很简单,造成这个报错的原因是header部分出错。相信大家写头部的时候都是在浏览器上复制过来的,有些浏览器的格式不同的,导致你粘贴到代码的时候,头部信息可能会有多余的空格,别小看这些空格,这些空格就是导致这个报错的直接原因 我这段代码,添加头部信息的...
今天出现微信安卓突然进不了网站,报 http 400 Bad Request -Invalid Header name错误 后面这个问题微信自处理了,没有找到问题出在哪里在。 网上查了一下,有人说是https协议没有问题。 微信已经出现过几次这样的坑了,下次微信还是突然有问题,其它没有问题的话,估计就是微信的坑了。
第一次遇见这种问题,虽然很小已解决,但还是要记录一下。 在爬取http://www.questmobile.com.cn/这个网站时,遇到图片无法加载的问题,其中显示如标题这种错误, 其他数据都可以抓取下来,但唯独图片不可加载。 这种问题就出现在请求头上,如下: self.headers = { ':authority': 'ws.questmobile.cn',...
&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;小编最近遇到一个问题,网页运行项目时,报400错误,网上的解释: &amp;amp;amp;nbsp;&amp;amp;amp;nbsp;由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。 &amp;amp;amp;nbsp;&amp;amp;amp;nbsp;1.断点调试,查看NetWork中执行的方法 ![在这里插入图片描述](ht
HTTP ERROR 400产生的流程和应对方法HTTP ERROR 400 Bad Request 产生的流程HTTP ERROR 400 Bad Request 产生的原因400错误为什么不能被自定义的异常处理器捕获并且处理为什么不能自己定制输出内容目前可以做的 HTTP ERROR 400 Bad Request 产生的流程 在使用springmvc相关的框架的时候,调用接口经常产生以下错误 这种错误往往在info的log级别下看不到日志,难以排查,我们先来模拟错误产生的其中一个原因 从spring
博主在本地运行了自己的项目,然后在另一台服务器上用node.js写了一个独立程序,该程序内会调用本地项目的接口,发现在配置完http请求的options–》hostname为本地的ip后,运行这个独立程序报错:HTTP Error 400. The request hostname is invalid. 开始以为我的本地ip设置错误或者防火墙阻挡或者网络通信有问题,后面经过分析:w...
回答: 当你在另一台服务器上用node.js写了一个独立程序,并调用本地项目的接口时,你遇到了"Bad Request - Invalid Hostname HTTP Error 400. The request hostname is invalid."的错误。这个错误通常与IIS Express-web服务器有关。当前只支持使用localhost作为hostname访问,而不支持使用IP地址作为hostname访问。[3]解决这个问题的方法是在IIS Express的配置中使本地项目支持以IP的形式作为hostname来访问。你可以按照以下步骤进行操作:在IIS -> 默认网站 -> 属性 -> 网站 -> IP地址 -> 高级中找到主机头值,将其设置为你的本地IP地址,或者直接重启IIS来解决问题。[2]这样,你的独立程序就可以成功调用本地项目的接口了。
【问题解决】Caused by: java.lang.ClassNotFoundException: com.mchange.v2.c3p0.ComboPooledDataSource