2017-03-20 2 views
1

J'ai affaire à une API dans laquelle je dois fournir un tableau JSON en tant que paramètre de requête dans une requête POST. La citation doit être dans l'URL, mais OkHttp et HttpURL continuent de le convertir en %22. L'API ne le reconnaîtra pas et renvoie un code d'erreur. Comment puis-je faire OkHttp préserver la citation dans la demande. Le code que je traite ressemble à ceci:Comment préserver les guillemets en utilisant OkHttp

public static void post(String url, String[][] requestParams, Callback callback) { 
    HttpUrl httpUrl = addParamsToURL(getAbsoluteUrl(url), requestParams); 


    Request request = new Request.Builder() 
      .url(httpUrl) 
      .addHeader("app", Prefs.getString(Constants.HEADER_APP, null)) 
      .addHeader("authoToken", Prefs.getString(Constants.HEADER_AUTH_TOKEN, null)) 
      .post(RequestBody.create(MediaType.parse("application/json"), "")) 
      .build(); 
    okHttpClient.newCall(request).enqueue(callback); 
} 

private static HttpUrl addParamsToURL(String url, String[][] requestParams) { 
    HttpUrl httpUrl = HttpUrl.parse(url); 
    HttpUrl.Builder urlBuilder = httpUrl.newBuilder(); 
    for(int i = 0, size = requestParams.length; i < size; i++) { 
     urlBuilder.addEncodedQueryParameter(requestParams[i][0], requestParams[i][1]); 
    } 
    return urlBuilder.build(); 
} 

je besoin de l'URL la demande va ressembler https://www.baseurl.com/path?queryName=["[email protected]"] mais il ressemble https://www.baseurl.com/path/?queryName=[%[email protected]%22]

Répondre

1

Bien que, vous devriez sérieusement considérer ce Jesse Wilson dit, mais vous pouvez voir comme une solution de contournement ce que les gens suggèrent faire dans ces discussions:

En particulier, Mike Nakhimovich suggests remplacer le caractère encodée à travers intercepteurs:

request.url(originalRequest.url().toString().replace("%3D","=")); 
+1

Il est avéré que le problème était _PAS_ les doubles citations, mais était une faute de frappe plus la ligne. Cependant, je sais que c'est un problème pour beaucoup de gens dont les serveurs sont mal configurés, alors je choisis votre réponse. – drawinfinity

2

Fix le serveur. OkHttp est compatible avec les navigateurs Web qui codent tous " à %22 dans les chaînes de requête.

Chrome:

GET /?a=[%[email protected]%22] HTTP/1.1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 

Firefox:

GET /?a=[%[email protected]%22] HTTP/1.1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0 

Safari

GET /?a=[%[email protected]%22] HTTP/1.1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8