2013-07-15 41 views
7

EDIT hoàn toàn tái làm việc các câu hỏi để hiểu rõ hơnexectuing http POST trả về HTML thay vì JSON

Tôi đã để truy vấn url cho http://api.bf3stats.com/pc/player/ với 2 thông số POST: 'chơi' (đối với tên người chơi) và ' opt '(cho các tùy chọn). Tôi đã thử nghiệm nó trên http://www.requestmaker.com/ với dữ liệu sau: player=Zer0conf&opt=all. Tôi nhận được phản hồi JSON đúng (nghĩ rằng tôi không biết trang web của họ thực hiện truy vấn như thế nào, tôi đoán đó là php). Bây giờ tôi đang cố gắng để làm điều tương tự trong Android:

private StringBuilder inputStreamToString(InputStream is) { 
     //this method converts an inputStream to String representation 
    String line = ""; 
    StringBuilder total = new StringBuilder(); 

    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

    try { 
     while ((line = rd.readLine()) != null) { 
      total.append(line); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return total; 
} 

và đó là cách tôi thực hiện yêu cầu:

public void postData(String url, String name) { 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(url); 

    try { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
        //qname is a String containing a correct player name 
     nameValuePairs.add(new BasicNameValuePair("player", qname)); 
     nameValuePairs.add(new BasicNameValuePair("opt", "all")); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 
     //test is just a string to check the result, which should be in JSON format 
     test = inputStreamToString(response.getEntity().getContent()) 
       .toString(); 

    } catch (ClientProtocolException e) { 

    } catch (IOException e) { 

    } 
} 

gì tôi nhận được trong 'test" Chuỗi không phải là JSON, nhưng hoàn chỉnh HTML đánh dấu của một số trang bf3stats. Bất kỳ ý tưởng những gì có thể xảy ra với yêu cầu của tôi?

enter image description here

+0

Xem nếu câu trả lời [ở đây] (http://stackoverflow.com/questions/9805300/using-httpget-returning-complete-html-code/9813473#9813473) giúp đỡ. – yorkw

Trả lời

10

bạn cần đặt loại nội dung "application/x-www-form-urlencoded" trong tiêu đề yêu cầu của bạn cho loại dữ liệu bạn muốn gửi.

Tôi đã kiểm tra API của bạn cho dữ liệu được đề cập ở trên, nó hoạt động tốt và tôi nhận được rất nhiều dữ liệu để phản hồi. Bạn có thể tìm thấy nó here.

Bạn có thể thử đoạn mã sau:

public String postDataToServer(String url) throws Throwable 
    { 

    HttpPost request = new HttpPost(url); 
    StringBuilder sb=new StringBuilder(); 

    String requestData = prepareRequest(); 
    StringEntity entity = new StringEntity(requestData); 
         entity.setContentType("application/x-www-form-urlencoded;charset=UTF-8");//text/plain;charset=UTF-8 
         request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); 

         request.setHeader("Accept", "application/json"); 
         request.setEntity(entity); 
         // Send request to WCF service 
         HttpResponse response =null; 
         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         //DefaultHttpClient httpClient = getNewHttpClient(); 
         HttpConnectionParams.setSoTimeout(httpClient.getParams(), 10*1000); 
         HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),10*1000); 
         try{ 

         response = httpClient.execute(request); 
         } 
         catch(SocketException se) 
         { 
          Log.e("SocketException", se+""); 
          throw se; 
         } 
         /* Patch to prevent user from hitting the request twice by clicking 
          * the view [button, link etc] twice. 
          */ 
         finally{ 
         } 



    InputStream in = response.getEntity().getContent(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    String line = null; 
    while((line = reader.readLine()) != null){ 
     sb.append(line); 

    } 
    Log.d("response in Post method", sb.toString()+""); 
    return sb.toString(); 
    } 

    public String prepareRequest() 
    { 

     return "player=Zer0conf&opt=all"; 
    } 

Edit: tôi đã nhận được lỗi vọng Không sai sót 417 cho Webservice của bạn. Vì vậy, chúng tôi cần thêm một thông số khác trong yêu cầu của mình. Đó là request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);. Tôi đã cập nhật mã trên với điều này. Bây giờ nó hoạt động tốt.

Phản hồi trông giống như thế này.

Response looks something like this.

Hy vọng điều này sẽ giúp.

Cheers
N_JOY

+0

Tôi đã sử dụng mã của bạn (tên người chơi được thêm làm thông số động) và vẫn nhận được một số nội dung HTML trong chuỗi "kiểm tra" ... đây là lớp hoàn chỉnh của tôi: http : //pastebin.com/QBpTcjAG Có lẽ tôi sẽ sai ở một số điểm? – Droidman

+0

Tôi đã thử nhưng bây giờ máy chủ đang cho 403 cấm –

+0

thực sự lạ .. chỉ cần thực hiện mã tôi đăng trên pastebin, không có lỗi nhưng HTML thay vì JSON .. – Droidman

0

Hãy thử để xem các url trong trình duyệt, tôi tin rằng có một tuyên bố DOCTYPE!, mà chắc chắn không thể phân tích cú pháp thành đối tượng JSON.

+0

Tôi được chuyển hướng đến trang chính nếu tôi cố mở URL trong trình duyệt, bạn có chắc là url không chính xác? Trước đây tôi đã từng nhận được một số phản hồi JSON nhưng hệ thống tôi làm việc hoàn toàn khác, bạn không thể mở url yêu cầu trong trình duyệt. – Droidman

+0

@ Maver1ck Nếu url đó yêu cầu một số loại biến phiên (như thông tin xác thực đăng nhập) không thể xem trực tiếp bằng trình duyệt, nhưng bạn có thể xác minh chuỗi jsonResults bằng cách sử dụng công cụ gỡ lỗi nhật thực hoặc chỉ cần đăng xuất để xem phản hồi nhận được. Một phản ứng JSON đúng không nên chứa khai báo DOCTYPE. – reTs

+0

Tôi đã chỉnh sửa câu hỏi, đang đi sai hướng .. – Droidman

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