5

Tôi phải tìm một số đối tượng JSON từ máy chủ từ xa và tôi đang sử dụng hàm này hoạt động tốt ngoại trừ đôi khi dữ liệu lạ bị lấy là bởi vì nó đang sử dụng bộ mã ASCII để giải mã.Làm thế nào tôi có thể thay đổi mã hóa bảng mã trong phản hồi HTTP trong Java

Hãy tìm thấy bên dưới phương pháp thw mà tôi đang sử dụng

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; 


    } 

Tất cả những tiêu đề mà tôi đang đi là chính xác và tôi đã xác minh cùng qua kiểm tra nguyên tố trong Google chrome hoặc Firebug Plugin nếu bạn đã quen thuộc với Mozilla .

Bây giờ vấn đề là hầu hết thời gian tôi nhận được dữ liệu có thể đọc được nhưng đôi khi tôi nhận được dữ liệu không đọc được.

Tôi đã gỡ lỗi bằng nhật thực và nhận thấy rằng bộ ký tự trong wrapEntity được hiển thị là "US-ASCII". Tôi đính kèm một jpg để tham khảo enter image description here

Ai đó có thể vui lòng cho tôi biết làm cách nào tôi có thể thay đổi bộ ký tự từ ASCII sang UTF-8 của câu trả lời trước khi tôi làm response = client.execute(httppost);. PS: Như bạn đã nhận thấy rằng tôi đang chuyển charset = utf-8 trong tiêu đề và tôi đã xác minh bằng firebug và google chrome mà tôi đang chuyển các tiêu đề chính xác.

Hãy phóng to để xem hình ảnh rõ ràng hơn

Cảm ơn trước

Trả lời

1

Bạn có thể cần thêm một tiêu đề Accept-mã hóa và thiết lập này sang UTF-8

+1

tôi đã thử nhưng không hoạt động cùng kết quả 'httppost.setHeader ("Accept-Encoding", "UTF-8"); ' – bourne

1

Tôi không nghĩ đó là một vấn đề với tiêu đề của bạn, tôi nghĩ rằng đó là một vấn đề với chuỗi của bạn. Chỉ cần có tiêu đề nói rằng utf-8 không có nghĩa là chuỗi bạn viết là utf-8 và điều đó phụ thuộc rất nhiều vào cách chuỗi được mã hóa và nội dung trong "payloadValue"

Điều đó nói rằng, bạn luôn có thể mã hóa lại chính xác điều đó trước khi gửi nó qua dây, ví dụ:

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

Xem điều đó có phù hợp với bạn hay không.

+0

cảm ơn câu trả lời nhưng nó không hoạt động, nhưng những gì tôi đang bối rối vì sự nghiêm ngặt là chỉ là một đối tượng json mà tôi đang đi qua trong tải trọng và cho dù tôi đang mã hóa nó trong utf-8 hay không nên không quan trọng. Tôi phải someh ow thay đổi mã hóa bảng mã của phản hồi tôi nghĩ rằng tôi không thể làm – bourne

10

tôi đã có thể giải quyết vấn đề vừa đề cập đến vấn đề này cho những người có thể gặp phải sự cố tương tự. sau khi nhận được phản ứng đầu tiên được tổ chức bằng cách sử dụng HttpEntity entity = response.getEntity(); và vì phản ứng của tôi đã được một tổ chức đối tượng json chuyển đổi sang chuỗi nhưng sử dụng "UTF-8" một cái gì đó như thế này responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));

trước đây tôi đã chỉ làm responseJsonObject = new JSONObject(EntityUtils.toString(entity));

+0

bạn có thể chấp nhận câu trả lời của riêng bạn quá – CyprUS

+1

Tôi cũng có cùng một vấn đề này, trong đó 'IOUtils.toString (entity.getContent()," UTF-8 ") 'cũng không hoạt động. Thay đổi nó thành 'EntityUtils' đã thực hiện công việc – divillysausages

Các vấn đề liên quan