Java调用WeatherAPI时HTTP请求参数传递失败的问题求助
解决WeatherAPI请求中q参数缺失的问题
你的问题出在q参数的传递方式上:WeatherAPI要求q(城市查询参数)作为URL查询字符串参数传递,而不是请求头字段。你把q: London写进请求头,服务器根本识别不到这个参数,所以返回了Parameter q is missing的错误。
修正方案
把q参数添加到请求URL的查询字符串中,API密钥key可以选择放在查询字符串里,或者继续保留在请求头中,两种方式都支持。
方式1:key和q都放在URL查询字符串
修正后的代码:
import java.io.*; import java.util.*; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import java.net.URLEncoder; public class WeatherService { public static void main(String[] args) throws IOException { Properties mavenProperties = new Properties(); InputStream propertiesStream = WeatherService.class.getResourceAsStream("/maven.properties"); mavenProperties.load(propertiesStream); final String API_KEY = mavenProperties.getProperty("api.key"); // 对城市名称做URL编码,避免空格等特殊字符导致解析错误 final String CITY = URLEncoder.encode("London", "UTF-8"); SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); try (SSLSocket socket = (SSLSocket)factory.createSocket("api.weatherapi.com", 443)) { socket.startHandshake(); Writer w = new OutputStreamWriter(socket.getOutputStream()); // 将q和key参数添加到URL查询字符串 w.write("GET /v1/current.json?q=" + CITY + "&key=" + API_KEY + " HTTP/1.1\r\n"); w.write("Host: api.weatherapi.com\r\n"); w.write("\r\n"); w.flush(); InputStream in = socket.getInputStream(); int b; while ((b = in.read()) != -1) System.out.write(b); } } }
方式2:key保留在请求头,q放在URL查询字符串
如果想继续用请求头传递API密钥,只需要调整URL部分:
w.write("GET /v1/current.json?q=" + CITY + " HTTP/1.1\r\n"); w.write("Host: api.weatherapi.com\r\n"); w.write("Key: " + API_KEY + "\r\n"); w.write("\r\n");
额外提示
- 城市名称如果包含空格、特殊字符,一定要用
URLEncoder.encode()做URL编码,否则会导致参数解析失败。 - 手动构建HTTP请求时,注意请求行和请求头的格式:每行必须以
\r\n结尾,最后一个请求头后要加一个空的\r\n表示请求头结束。
内容的提问来源于stack exchange,提问作者dSofarts
相关产品推荐
相关产品推荐

