2016-06-24 6 views
0

HTTP 요청을 일반 String과 함께 WiFi 컨트롤러로 보내려고합니다. 내 문자열은 API:W/PSS:12345이지만 내 Android 앱을 통해 전송 된 경우 컨트롤러는 API=W%2FPSS%3A12345을 수신합니다. 헤더 값 content-type: application/x-www-form-urlencoded으로 인해이 문제가 발생한다는 것을 알고 있습니다.발리 보내기 인코딩없이 요청 보내기

그러나, 내 요청에 나는 방법 오버라이드 (override) 한 :

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

일반 텍스트 콘텐츠 유형을 설정,하지만 발리는 여전히 보내기 전에 인코딩합니다. (내 PC에서 REST 클라이언트를 사용하면 인코딩하지 않고 컨트롤러에 요청을 보냅니다.)

내 문자열을 발리 인코딩하지 않고 일반 텍스트로 보낼 수있는 방법이 있습니까? 컨트롤러는 낮은 레벨이므로 양쪽에 인코딩을 추가하고 싶지는 않습니다. 그냥 일반 문자열을 보냅니다.

답변

0

발리슛 소스 코드를 통해 파고 후, 나는 자바 URLEncoder.encode() 메소드가 호출되는 것으로 범인을 발견 , 어떤 문자열을 인코딩합니다 ... 나는 아주 해킹 - y를 방법으로 이것을 건너 뜁니다. 이것은 아주 못생긴 당신의, 이것은 알려 주시기 바랍니다 일을 더 나은 방법이있는 경우 :

발리의 소스 코드는 여기에
@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); 
     } 
} 

, 당신은 항목을 인코딩 방법을 살펴 수 있습니다 https://android.googlesource.com/platform/frameworks/volley/+/idea133/src/com/android/volley/Request.java

0
뿐만 아니라 대해 getHeaders 방법을 무시하고이 같은 헤더에 콘텐츠 형식을 설정

:

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

방금 ​​시도했으나 발리는 보내기 전에 인코딩합니다. 그냥 명확하게 : 이제 두 콘텐츠 형식 헤더가 있습니다. 'applcation/text'뿐만이 아닙니다. utf-8 인코딩이나 그와 비슷한 것을 추가해야합니까? –