【问题标题】:HTTP Error fetching URL. Status=400HTTP 获取 URL 时出错。状态=400
【发布时间】:2019-03-26 06:06:43
【问题描述】:

JSoup 似乎适用于我尝试过的几乎所有 URL,但这个给了我 400 错误。

String url = "http://localad.walmart.com?storeref=3008&forceview=y";

Response response = Jsoup.connect(url.replaceAll(" ", "%20"))
    .method(Method.GET)
    .userAgent("Mozilla")
    .followRedirects(false)
    .timeout(5000)
    .data("pragma", "no-cache")
    .execute(); 

我得到的错误是:

Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=400, URL=http://localad.walmart.com?storeref=3008&forceview=y&pragma=no-cache
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:424)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:178)

【问题讨论】:

  • 你能帮忙解决这种情况吗?你有答案吗?

标签: jsoup


【解决方案1】:

当 JSoup 在 400 Bad Request 上抛出一个致命异常时有点烦人,因为这会完全终止任何正在运行的进程,即使包装在 try/catch 中也是如此。但是,嘿。

对此有一个解决方案,在您的初始连接 URL 上,附加该方法;

.ignoreHttpErrors(true)

例如;

Jsoup.connect(url).ignoreHttpErrors(true).execute().statusCode();

然后它会为您提供官方的“400”状态代码,而不是引发致命异常。

我知道这是一篇旧帖子,但在寻找解决这个问题的方法时遇到了这个帖子以供参考。

【讨论】:

    【解决方案2】:

    400 是错误请求。

    您应该尝试URLEncoder.encode(url, "UTF-8") 而不是使用replaceAll

    【讨论】:

    • 我确实尝试过,但因为 URL 没有引发 MalformedURLException 的协议
    【解决方案3】:

    继续前进,不依赖 JSoup 来解析中间(重定向的 URL)。我需要最终的重定向 URL(JSoup 使用它没有问题),所以使用以下代码来获取它。

    import java.net.URI;
    import org.apache.http.HttpRequest;
    import org.apache.http.HttpResponse;
    import org.apache.http.ProtocolException;
    import org.apache.http.impl.client.DefaultRedirectStrategy;
    import org.apache.http.protocol.HttpContext;
    
    public class MyRedirectHandler extends DefaultRedirectStrategy {
    
        public URI lastRedirectedUri;
    
        @Override
        public boolean isRedirected(HttpRequest request, HttpResponse response, 
            HttpContext context) {
        try {
            return super.isRedirected(request, response, context);
         } catch (ProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
        }
    
        @Override
        public URI getLocationURI(HttpRequest request, HttpResponse response, HttpContext context)
            throws ProtocolException {
    
            lastRedirectedUri = super.getLocationURI(request, response, context);
            return lastRedirectedUri;
        }
    

    调用代码:

        DefaultHttpClient httpclient = new DefaultHttpClient();
        String url2 = "http://localad.walmart.com/walmart/new_user_entry.aspx?storeref=3008&forceview=y";
        MyRedirectHandler handler = new MyRedirectHandler();
        httpclient.setRedirectStrategy(handler);
    
        HttpGet get = new HttpGet(url2);
        httpclient.execute(get);
    
        String lastUrl = url2;
        if (handler.lastRedirectedUri != null) {
            lastUrl = handler.lastRedirectedUri.toString();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多