2016-03-20 3 views
0

Ich versuche, auf eine OAuth2 Server-Implementierung unter Verwendung der folgenden Klasse (für Vollständigkeit Posting voll) zu verbinden:GWT RequestBuilder setHeader nicht funktioniert

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); 
      } 
     }); 
    } 
} 

Wie Sie sehen können, ich anfügen deutlich Content-Type, Akzeptieren und Autorisierung zum Header. Außerdem poste ich einige Daten.

In Wirklichkeit aber sieht die Anfrage wie folgt aus:

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 

Ich würde nicht erwarten, dass eine Anfrage so zu sehen, die über Setup gegeben. Was ist mit meinen Anforderungsheadern passiert? Außerdem ist überhaupt kein Anfragekörper vorhanden. Und warum ist der Anfragetyp Option? Kann jemand etwas Licht abwerfen?

Antwort

1

Dies liegt daran, dass die Anfrage querversetzt ist. Sie sehen also die Preflight-Anfrage in CORS. Es ist das erwartete Verhalten, und der Server muss es mit dem entsprechenden Antwortheader autorisieren.