Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 403响应代码-输入是否正确?_Java_Url - Fatal编程技术网

Java 403响应代码-输入是否正确?

Java 403响应代码-输入是否正确?,java,url,Java,Url,不确定你们中有多少人熟悉Bukkit/Mojang API,但是,这就是我今天要使用的。虽然我不认为这与这个问题有任何关联,因为这似乎是一个本地问题 我通过Mojang的身份验证wiki连接到身份验证服务: 在我的代码中,“MinecraftAccount”只是一个表示上面链接中有效负载的对象,我用GSON序列化了该链接 然后,我想获取发送回来的输入响应,其中的属性也可以在上面的链接中找到。我使用另一个对象来保存json值,并使用json(AuthResponse)对其进行反序列化 看起来我做

不确定你们中有多少人熟悉Bukkit/Mojang API,但是,这就是我今天要使用的。虽然我不认为这与这个问题有任何关联,因为这似乎是一个本地问题

我通过Mojang的身份验证wiki连接到身份验证服务:

在我的代码中,“MinecraftAccount”只是一个表示上面链接中有效负载的对象,我用GSON序列化了该链接

然后,我想获取发送回来的输入响应,其中的属性也可以在上面的链接中找到。我使用另一个对象来保存json值,并使用json(AuthResponse)对其进行反序列化

看起来我做的每件事都是对的,但是我犯了403错误。我不确定为什么,因为经过几次尝试,这是正确的,它的工作,然后自发地开始吐出403再次。希望你们能看到这里的问题

public String getAuthToken(MinecraftAccount minecraftAccount) {
    try {
        HttpURLConnection httpURLConnection = Webs.getConnection("https://authserver.mojang.com/authenticate");
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setDoInput(true);
        httpURLConnection.setInstanceFollowRedirects(false);
        httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8");
        httpURLConnection.setRequestProperty("Content-Type", "application/json");
        httpURLConnection.setUseCaches(false);

        httpURLConnection.addRequestProperty("User-Agent", "Mozilla/4.0");

        IOUtils.write(GsonProvider.standard().toJson(minecraftAccount), httpURLConnection.getOutputStream(), StandardCharsets.UTF_8);
        return GsonProvider.standard().fromJson(IOUtils.toString(httpURLConnection.getInputStream(), StandardCharsets.UTF_8), AuthResponse.class).getAccessToken();
    } catch (IOException exception) {
        exception.printStackTrace();
    }
    return null;
}

    public void uploadSkin(UUID uuid, String url, boolean normal) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(ImageIO.read(new URL(url)), "png", baos);

        String authenticityToken = this.getAuthToken(this.minecraftAccount);

        try {
            System.out.println("Token: " + authenticityToken);

            if (authenticityToken == null) {
                return;
            }

            HttpURLConnection httpURLConnection = Webs.getConnection(String.format(UPLOAD_SKIN_URL, UUIDTypeAdapter.fromUUID(uuid)));
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);

            httpURLConnection.addRequestProperty("Authorization", "Bearer " + authenticityToken);
            try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURLConnection.getOutputStream(), StandardCharsets.UTF_8))) {
                writer.write("model=");
                if (!normal) {
                    writer.write("slim");
                }

                writer.write("&url=" + UrlEscapers.urlPathSegmentEscaper().escape(url));
                System.out.println("status: " + httpURLConnection.getResponseMessage() + "(" + httpURLConnection.getResponseCode() + ")");
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }

    } catch (IOException exception) {
        exception.printStackTrace();
    }
}
Web#getConnection就是这样(使用Proxy.NO#Proxy):

PS:是的,我看过其他几个403线程,但是,它们的解决方案(比如将用户代理设置为补丁)不起作用

最终,调用#uploadSkin不会出错,它只返回403,实际上不会将文件上传到站点或其他任何地方。该方法仅输出以下内容:


尝试使用curl或postman进行调试。即使得到403响应,响应中也应该有一条错误消息。示例:{“错误”:“禁止操作异常”,“错误消息”:“无效凭据。无效用户名或密码。”}未返回任何错误。调用httpURLConnection.getResponseMessage()时,仅使用403和“禁止”;就像我说的,试着用curl或postman提出请求。另外,请检查getErrorStream()方法。谢谢!这似乎有助于查明问题所在。在读取错误流包含的内容后,我显然指定了一个无效的URL。我不知道如何像在wiki上那样对其进行“哈希处理”:http%3A%2F%2Fassets.mojang.com%2FSkinTemplates%2Fsteve.pngForgot要说的是,它现在返回500个错误代码,说明URL无效。我正在使用wiki中的url:
    public static HttpURLConnection getConnection(String url, Proxy proxy) throws IOException {
    HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection(proxy);

    httpConnection.setConnectTimeout(TIMEOUT);
    httpConnection.setReadTimeout(2 * TIMEOUT);

    httpConnection.setRequestProperty(HttpHeaders.CONTENT_TYPE, "application/json");
    httpConnection.setRequestProperty(HttpHeaders.USER_AGENT, "Mozilla/5.0");
    return httpConnection;
}