GWT RequestBuilder setHeader 不工作

GWT RequestBuilder setHeader not working

我正在尝试使用以下 class 连接到 OAuth2 服务器实现(post为了完整性而完整):

import com.google.gwt.http.client.*;
import com.googlecode.gwt.crypto.bouncycastle.util.encoders.Base64;

import java.util.Map;
import java.util.function.Consumer;

public class HttpManager {

    private static String toFormData(Map<String, String> data) {

        StringBuilder sb = new StringBuilder();

        for (Map.Entry<String, String> entry : data.entrySet())
            sb.append("&")
                    .append(entry.getKey())
                    .append("=")
                    .append(entry.getValue());

        sb.deleteCharAt(0);
        return sb.toString();
    }

    public void postFormData(String url, Map<String, String> data, Consumer<Response> onSuccess, Consumer<Response> onFail) throws RequestException {

        final String dataAsString = toFormData(data);
        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url);
        builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
        builder.setHeader("Accept", "application/x-www-form-urlencoded");
        builder.setHeader("Authorization", "Basic " + Base64.encode(("appId" + ":" + "oauthSecret").getBytes()));

        builder.sendRequest(dataAsString, new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
                if(response.getStatusCode() >= 400) {
                    onFail.accept(response);
                } else {
                    onSuccess.accept(response);
                }
            }

            @Override
            public void onError(Request request, Throwable throwable) {
                onFail.accept(null);
            }
        });
    }
}

如您所见,我清楚地附加了 Content-TypeAcceptAuthorization 到 header。此外,我 post 沿用了一些数据。

但实际上,请求看起来像这样:

OPTIONS /oauth/token HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://192.168.2.101:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Access-Control-Request-Headers: accept, authorization, content-type
Accept: */*
Referer: http://192.168.2.101:8888/demo.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

考虑到上述设置,我不希望看到这样的请求。我的请求 headers 怎么了?此外,根本没有请求 body。为什么请求类型是Option?任何人body 都可以解释一下吗?

这是因为请求是 cross-origin,而您看到的是CORS 说法中的预检请求。这是预期的行为,服务器必须使用适当的响应对其进行授权 header。