java - 如何使用涉及 Java 中的重定向的 header 执行 HTTP 请求

标签 java python apache go

我处于一种奇怪的情况,我不确定到底是什么问题。我需要做一个简单的 HTTP 来获取带有授权 header 的 Java 请求。我正在使用 Apache HTTP 客户端执行此操作,但我不断收到 400 ,这是我的一些尝试。
尝试1:

HttpClient httpClient = HttpClients.custom()
    .setDefaultRequestConfig(RequestConfig.custom()
        .setCookieSpec(CookieSpecs.STANDARD).setRedirectsEnabled(true).build())
    .build();

HttpUriRequest request = RequestBuilder.get()
    .setUri("https://example.com/")
    .setHeader("Authorization", "<key>")
    .build();

HttpResponse resp = httpClient.execute(request);
System.out.println(resp.getStatusLine().getStatusCode());
尝试2:
//Using HttpURLConnection 
URL newUrl = new URL("https://example.com/");
HttpURLConnection con = (HttpURLConnection) newUrl.openConnection();
con.setRequestProperty("Authorization", "<key>");
con.setDoInput(true);
con.setRequestMethod("GET");
con.setInstanceFollowRedirects(true);
System.out.println(con.getResponseCode());
我尝试了许多其他方法,但所有尝试都给了我 400 响应代码。请注意,我使用的 URL 涉及重定向。
现在,当我在 Python 中尝试相同的操作时,我得到 200 :
import requests
r=requests.get("https://example.com/", headers={"Authorization":"<key>"})
print(r.status_code)
现在,当我在 Go 中做同样的事情时,我得到 200 :
import (
    "net/http"
    "fmt"
)
req, _ := http.NewRequest("GET", "https://example.com/", nil)
req.Header.Add("Authorization", "<key>")
resp, _ = api.Do(req)
fmt.Println(resp.StatusCode)
我很困惑为什么它不能在 Java 中工作。我从 Java 请求中得到的错误消息是这样的:

InvalidArgumentOnly one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified

最佳答案

所以我终于让它工作了,感谢 Jabir 的评论,这个链接确实帮助我解决了这个问题。这是我如何让它工作的

HttpClient httpClient = HttpClients.custom()
    .setDefaultRequestConfig(RequestConfig.custom()
        .setCookieSpec(CookieSpecs.STANDARD).setRedirectsEnabled(true).build())
    .setRedirectStrategy(new LaxRedirectStrategy() {

        public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)  {
            boolean isRedirect=false;
            try {
                isRedirect = super.isRedirected(request, response, context);
            }
            catch (ProtocolException e) {
                e.printStackTrace();
            }  
            if (!isRedirect) {
               int responseCode = response.getStatusLine().getStatusCode();
                if (responseCode == 301 || responseCode == 302) {
                    return true;
                }
            }
            return isRedirect;
        }
        @Override
        public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException {
        String cokeis = response.getHeaders("Set-Cookie")[0].getValue();
        HttpRequestBase requestBase = new HttpRequestBase() {
            @Override
            public String getMethod() {
                return "GET";
            }
        };
        requestBase.setURI(getLocationURI(request, response, context));
        requestBase.setHeader("Cookie", cokeis);
        return requestBase;
        }
    })
    .build();

HttpUriRequest request = RequestBuilder.get()
    .setUri("https://example.com/")
    .setHeader("Authorization", "<key>")
    .build();

HttpResponse resp = httpClient.execute(request);
System.out.println(resp.getStatusLine().getStatusCode());

我仍然无法相信,尽管复杂性涉及 apache java http 客户端执行与其他语言相比重定向的简单 http get 请求。

关于java - 如何使用涉及 Java 中的重定向的 header 执行 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292192/

相关文章:

java - 无法将 void 转换为 java.lang.Void

python - 如何使用 Django 比较要使用 Markdown 渲染的两个模型?

python - 子进程调用错误版本的 'time'

php - htaccess : Redirect file. php到file.html,同时阻止直接访问file.php

php - 在 Python WSGI 环境中运行 PHP 脚本

java - 寻找日期格式的最佳正则表达式模式

java - Spring 中的异常处理程序

java - 在Linux服务器上启动netty应用程序

python - 敷面膜时颜色显示错误

apache - 在 Ubuntu 14.04 'has no installation candidate' 中安装 Apache2 时遇到错误