gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:29:29 25 4
gpt4 key购买 nike

我处于一种奇怪的情况,我不确定到底是什么问题。我需要做一个简单的 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 mechanismallowed; only the X-Amz-Algorithm query parameter, Signature querystring parameter or the Authorization header should bespecified

最佳答案

所以我终于让它工作了,感谢 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com