OpenWeatherMap REST API 总是返回 HTTP 301

Posted

技术标签:

【中文标题】OpenWeatherMap REST API 总是返回 HTTP 301【英文标题】:OpenWeatherMap REST API is returning always HTTP 301 【发布时间】:2020-09-26 06:40:38 【问题描述】:

我正在尝试处理来自 API (http://samples.openweathermap.org/data/2.5/weather?q=London,uk) 的 JSON 数据,但我在我的 logcat 窗口中得到了这个:301 Moved Permanently

这是我的班级:

public class MainActivity extends AppCompatActivity 

    public class DownloadTask extends AsyncTask<String,Void,String> 

        @Override
        protected String doInBackground(String... urls) 
            String result = "";
            URL url;
            HttpURLConnection urlConnection;
            try 
                url = new URL(urls[0]);
                urlConnection = (HttpURLConnection) url.openConnection();
                InputStream in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                int data = reader.read();

                while (data != -1) 
                    char current = (char) data;
                    result += current;
                    data = reader.read();
                

                return result;


             catch (Exception e) 
                e.printStackTrace();
                return null;
            
        

        @Override
        protected void onPostExecute(String s) 
            super.onPostExecute(s);
            Log.i("JSON",s);
        
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DownloadTask task = new DownloadTask();
        task.execute("http://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02");
    

【问题讨论】:

您是否尝试在浏览器中打开网址?我已经尝试过使用邮递员并且它有效。也许您的本地网络有问题? 是的,我试过了,我得到了回应 一个 http 301 表示您正在调用的 url 是“旧的”并且已移动到​​另一个 url。这意味着您应该遵循通过响应中的标头传递的新 url。尝试阅读 http 标头并查找更多信息。 @Yusef Maali,我尝试了不同的链接并得到了回复。我不知道为什么): 请检查答案,您会找到所有详细信息 【参考方案1】:

您是否在 androidManifest.xml 中授予 android studio 使用 INTERNET 的权限?

【讨论】:

是的,但我仍然无法获取数据 你为什么不使用改造或类似的库来进行网络调用?除非特别需要,否则现在使用 HTTP 连接似乎是多余的 也许我稍后会检查一下【参考方案2】:

我用Postman(试一试)来分析发生了什么。

您提供的网址是:http://samples.openweathermap.org/data/2.5/weather?q=London,uk&amp;appid=439d4b804bc8187953eb36d2a8c26a02。 阅读回复,您会发现:

正文:

<html>

<head>
    <title>301 Moved Permanently</title>
</head>

<body bgcolor="white">
    <center>
        <h1>301 Moved Permanently</h1>
    </center>
    <hr>
    <center>openresty/1.9.7.1</center>
</body>

</html>

原始 HTML 响应:

HTTP/1.1 301 Moved Permanently
Server: openresty/1.9.7.1
Date: Sun, 07 Jun 2020 10:49:57 GMT
Content-Type: text/html
Content-Length: 190
Connection: keep-alive
Location: https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02

正如 cmets 中所说,当您收到 HTTP 30x(请参阅:Redirection messages)时,服务器会告诉您您调用的 url 是旧的。如果您想要正确的响应,您应该遵循(因此“重定向”消息)服务器在 http 标头中传递给您的新 url。

您要查找的 http 标头是 Location,即报告此 url:

https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02

通过两个网址的一点差异,服务器告诉您调用网址的https 风格。 这是一种常见做法,请始终使用https 网址(如果有)。

【讨论】:

以上是关于OpenWeatherMap REST API 总是返回 HTTP 301的主要内容,如果未能解决你的问题,请参考以下文章

OpenWeatherMap.ORG API - $.getJSON 不起作用,我没有收到任何数据

使用 OpenWeatherMap API 会出现 401 错误

python使用openweathermap API获取全世界主要城市天气信息

如何在 android 的 OpenWeatherMap api 中更改描述语言

错误:对象无效作为React子级(Axios和openweathermap API)

带有 OpenWeatherMap 平铺层叠加的 Google Maps Javascript API