5

Devo recuperare alcuni oggetti JSON da un server remoto e per quello sto usando questa funzione che funziona benissimo tranne per il fatto che per qualche tempo alcuni dati strani vengono recuperati che credo è perché sta usando il set di caratteri ASCII per decodificare.Come posso cambiare la codifica del charset nella risposta HTTP in Java

Di seguito riportiamo il metodo THW che sto usando

public HttpResponse call(String serviceURL,String serviceHost,String namespace,String methodName,String payloadKey, String payloadValue) throws ClientProtocolException,IOException,JSONException 
    { 
      HttpResponse response = null; 
      HttpContext HTTP_CONTEXT = new BasicHttpContext(); 
      HTTP_CONTEXT.setAttribute(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0"); 
      HttpPost httppost = new HttpPost(serviceURL); 
      httppost.setHeader("User-Agent",Constants.USER_AGENT_BROWSER_FIREFOX); 
      httppost.setHeader("Accept", "application/json, text/javascript, */*"); 
      httppost.setHeader("Accept-Language","en-US,en;q=0.8"); 
      httppost.setHeader("Content-Encoding", "foo-1.0"); 
      httppost.setHeader("Content-Type", "application/json; charset=UTF-8"); 
      httppost.setHeader("X-Requested-With","XMLHttpRequest"); 
      httppost.setHeader("Host",serviceHost); 
      httppost.setHeader("X-Foo-Target", String.format("%s.%s", namespace,methodName)); 
      /*Making Payload*/ 
      JSONObject objectForPayload = new JSONObject(); 
      objectForPayload.put(payloadKey, payloadValue); 
      StringEntity stringentity = new StringEntity(objectForPayload.toString()); 
      httppost.setEntity(stringentity); 
      response = client.execute(httppost); 
      return response; 


    } 

Tutte queste intestazioni che sto passando siano corretti e ho verificato la stessa via ispezionare elemento in Google Chrome o un plugin Firebug se si ha familiarità con Mozilla .

Ora il problema è che il più delle volte ottengo i dati leggibili ma a volte ottengo dati illeggibili.

Ho eseguito il debug utilizzando eclipse e ho notato che il set di caratteri sotto wrappedEntity viene visualizzato come "US-ASCII". Allego un jpg per riferimento enter image description here

Qualcuno può dirmi come posso cambiare il set di caratteri da ASCII a UTF-8 della risposta prima di fare response = client.execute(httppost);. PS: Come hai notato, sto passando charset = utf-8 nell'intestazione e che ho già verificato usando firebug e google chrome che sto passando le intestazioni esatte.

Si prega di zoom per vedere l'immagine più chiara

Grazie in anticipo

risposta

1

Potrebbe essere necessario aggiungere un header Accept-Encoding e impostarlo su UTF-8

+1

ho provato, ma non ha funzionato lo stesso risultato 'httppost.setHeader (" Accept-Encoding "," UTF-8 ");' – bourne

1

Non credo è un problema con le tue intestazioni, penso che sia un problema con la tua stringa. Il fatto che l'intestazione sia utf-8 non significa che la stringa che scrivi sia utf-8, dipende molto da come è stata codificata la stringa e da cosa è contenuto nel "payloadValue"

Detto questo, puoi sempre ricodificare la cosa correttamente prima di inviarla attraverso il filo, ad esempio:

objectForPayload.put(payloadKey, payloadValue); 
StringEntity stringentity = new StringEntity(
    new String(
     objectForPayload.toString().getBytes(), 
     "UTF8")); 

Verificare se questo funziona per voi.

+0

grazie per la risposta ma non ha funzionato, ma cosa sono confuso perché la stringentità è solo un oggetto json che sto passando nel payload e se lo sto codificando in utf-8 o non dovrebbe avere importanza. Devo ow cambiare la codifica di charset della risposta penso che non sono in grado di fare – bourne

10

Sono stato in grado di risolvere il problema menzionandolo solo per le persone che potrebbero dover affrontare problemi simili. dopo aver ottenuto la risposta prima ottenere l'entità utilizzando HttpEntity entity = response.getEntity(); e dal momento che la mia risposta è stata un'entità oggetto JSON convertito alla stringa ma utilizzando "UTF-8" qualcosa di simile responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));

precedenza stavo solo facendo responseJsonObject = new JSONObject(EntityUtils.toString(entity));

+0

puoi accettare anche le tue risposte – CyprUS

+1

Ho avuto lo stesso problema, dove 'IOUtils.toString (entity.getContent()," UTF-8 ") 'Non funzionava neanche. Cambiarlo in 'EntityUtils' ha funzionato – divillysausages

Problemi correlati