GWT RequestBuilder setHeader无法正常工作

时间:2016-03-20 02:43:32

标签: java http gwt

我正在尝试使用以下类连接到OAuth2服务器实现(为完整性而发布完整版):

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-Type Accept Authorization 附加到标题中。此外,我发布了一些数据。

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

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

鉴于上述设置,我不希望看到这样的请求。我的请求标题发生了什么变化?此外,根本没有请求机构。为什么请求类型 Option ?任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

这是因为请求是跨域请求,您所看到的是CORS用语中的预检请求。它是预期的行为,服务器必须使用适当的响应头进行授权。