2016-06-24 5 views
0

Ich versuche, eine HTTP-Anforderung an einen WLAN-Controller zu senden, mit einem normalen String. Mein String ist API:W/PSS:12345 aber, wenn sie über meine Android App geschickt, der Controller recieves API=W%2FPSS%3A12345. Ich weiß, dass dies aufgrund des Header-Werts content-type: application/x-www-form-urlencoded geschieht.Volley Anfrage senden, ohne dafür kodierenden

Doch meine Anfrage habe ich die Methode außer Kraft gesetzt:

public String getBodyContentType() { 
    return "text/html;"; 
} 

den Inhaltstyp in Klartext zu setzen, aber volley kodiert sie noch vor dem Senden. (Ein REST-Client auf meinem PC verwenden, sendet die Anfrage an die Steuerung ohne codierende)

Gibt es eine Möglichkeit, meine Zeichenfolge zu senden als Klartext ohne Volley es kodiert? Der Controller ist Low-Level, so dass ich keine Codierung auf beiden Seiten hinzufügen möchte, senden Sie nur einfache Zeichenfolgen.

Antwort

0

Nachdem durch den Volley-Quellcode zu graben, ich den Schuldigen gefunden zu sein, dass ein Java-URLEncoder.encode() Methode aufgerufen wird , die die Zeichenfolge codieren wird, egal was ... Ich überspringe das mit einem sehr hackigen Weg. Wenn einer von euch einen besseren Weg, dies zu tun lass es mich wissen, wie diese sehr hässlich ist:

@Override 
public String getBodyContentType() { 
    //for settings the content=type header, the right way... 
    return return "text/html"; 
} 

@Override 
public byte[] getBody() throws AuthFailureError { 
    Map<String, String> params = getParams(); 
     if (params != null && params.size() > 0) { 
      return encodeParameters(params, getParamsEncoding()); 
     } 
    return null; 
} 

//Hax....... 
private byte[] encodeParameters(Map<String, String> params, String paramsEncoding){ 
    StringBuilder encodedParams = new StringBuilder(); 
     try { 
      for (Map.Entry<String, String> entry : params.entrySet()) { 
       encodedParams.append(entry.getKey()); 
       //encodedParams.append(':'); 
       encodedParams.append(entry. 
       //encodedParams.append('&'); 
      } 
      return encodedParams.toString().getBytes(paramsEncoding); 
     } catch (UnsupportedEncodingException uee) { 
      throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee); 
     } 
} 

Der Quellcode Volley hier ist, können Sie einen Blick auf, wie es kodiert Artikel: https://android.googlesource.com/platform/frameworks/volley/+/idea133/src/com/android/volley/Request.java

0

die getHeaders Methode außer Kraft setzen, wie gut und stellen Sie Ihren Content-Type im Header wie folgt aus:

public Map<String, String> getHeaders() throws AuthFailureError { 
    HashMap<String, String> headers = new HashMap<String, String>(); 
    headers.put("Content-Type", "application/text"); 
    return headers; 
} 
+0

versucht es einfach, kodiert volley es noch vor dem Senden. Nur um zu klären: Jetzt habe ich beide Content-Type-Header. Nicht nur "Anwendung/Text". Muss ich die UTF-8-Kodierung oder ähnliches hinzufügen? –