2016-03-31 11 views
3

ich folgenden Code, wo ich eine API nenne, die ein PHP gebaut ist. Der Code kehrt JSon wie die unten angegeben ich in einem String Objekt sammle. Das Problem ist, seine Arbeit an einigen Trägern und auf wenigen Geräten mit anderen Carriern/WiFi-Verbindung seines Wurf JSONException Ende der Eingabe auf Zeichen 0 Ausnahme, weiß ich, das kommt, wenn Eingabestring leer ist, bedeutet die Stringbuilder-Objekt ist leer. Problem ist, dass ich keinen Zugang zu den Geräten habe, auf denen es diese Fehler wirft.Ende der Eingabe an Charakter 0 Fehler auf einigen Geräten

Ich bin nicht auf einem Gerät bekommen, warum Code folgenden leeren String zurückgibt und auf einige seiner adaequat, Benutzer hat auf 3G sowie Wi-Fi getestet diese Geräte in anderen Ländern auf verschiedenen Trägern sind.

  HttpClient httpClient = HttpClientBuilder.create().build(); 
      HttpPost postRequest = new HttpPost(ServiceUrls.base_url + ServiceUrls.get_profile_url); 

      JSONObject object = new JSONObject(); 
      object.put("username", params[0]); 

      StringEntity input = new StringEntity(object.toString()); 
      input.setContentType("application/json"); 
      postRequest.setEntity(input); 

      HttpResponse response = httpClient.execute(postRequest); 

      if (response.getStatusLine().getStatusCode() != 200) { 
       throw new RuntimeException("Failed : HTTP error code : " 
         + response.getStatusLine().getStatusCode()); 
      } 

      BufferedReader br = new BufferedReader(
        new InputStreamReader((response.getEntity().getContent()))); 

      String output; 
      StringBuilder stringBuilder = new StringBuilder(); 
      while ((output = br.readLine()) != null) { 
       stringBuilder.append(output); 
      } 

Wenn es für all API-Aufruf ist dann war es logisch, aber doest für anderen API-Aufruf passieren, dieser API-Aufruf zurückgibt größeren Größe JSON-String wie in String folgt

{
"status" : 1, "Parken": {
"name": "ghgjjghghg" "Kosten": 3, "ownerId": 29, "Adresse": "xyz pqr" "Slots": 4, "Bild": "d 4bc95c1dd031685746f2c3570788acf.jpg“, "Details": "gjhjghjgg", "Annehmlichkeiten": "gjhg", "id": 70, "lon": 73,7898023, "lat": 19,9974533, "Typ": 0 , "verfügbar": 1 }, "Bewertung": 0, "ratingCount": 0, "Besitzer": {
"id": 29, "username": "[email protected]" , "Passwort": "", "Fullname": "vi hdjh" "phone": "23434fddf" "CCNUM": null, "ccType": null, "type": 1, "authType": 1, "Bild": "582e3a77d76ae3203cfd6d6a346da429.jpg", "dni": "abc123", "Konto": "ABCBANK" } }

Ich habe keine Ahnung, was passiert, bitte helfen. Jede Eingabe wird geschätzt.

+0

Der Code, den Sie gepostet haben, gibt * nichts * zurück. Willst du sagen, dass 'stringBuilder' null ist? Oder dass es keine Charaktere enthält? Oder etwas anderes? – azurefrog

+0

Ja @azurefrog stringbuilder ist null –

+0

Der StringBuilder ist * nicht * null. Es ist * leer. * Die von Ihnen beschriebene Bedingung tritt auf, wenn die Eingabe * leer * ist. Es ist unmöglich, Ihnen zu helfen, wenn Sie nicht genau sein können. – EJP

Antwort

3

Es ist nichts Ungewöhnliches über den Code Sie auf dem Laufenden. Keine Hinweise dort.

Lassen Sie mich zusammenfassen, was ich denke, Sie über die Symptome sagte.

  • Bei einigen Geräten/Trägern schlägt ein bestimmter API-Aufruf fehl. Aber nicht alle Geräte/Träger.

  • Für die gleichen Geräte/Träger wie oben, funktionieren andere API-Aufrufe, alle, wenn die Zeit.

  • Der clientseitige Code ist in allen Fällen identisch mit den URLs.

  • Für mich zeigt dies auf ein Problem auf der Server-Seite, die durch das, was die Anfragen aussehen, ausgelöst wird.Aber so oder so würde ich versuchen, dies zu untersuchen, indem ich die Anfragen und Antworten auf der Serverseite betrachte und die serverseitigen Protokolle überprüfe. Sehen Sie, ob es signifikante Unterschiede in den Anforderungen gibt, die von verschiedenen Geräten/Trägern kommen. Vor allem diejenigen, die gegen diejenigen arbeiten, die nicht funktionieren. Und sehen Sie, ob die Antworten leer sind, wenn der Server sie sendet.

    0

    Der Code kann durch Überprüfung verbessert werden (bevor es in den String-Builder setzen), ob die Länge des Inhalts ist größer als 0.

    HttpClient httpClient = HttpClientBuilder.create().build(); 
    HttpPost postRequest = new HttpPost(ServiceUrls.base_url + 
         ServiceUrls.get_profile_url); 
    
    JSONObject object = new JSONObject(); 
    object.put("username", params[0]); 
    
    StringEntity input = new StringEntity(object.toString()); 
    input.setContentType("application/json"); 
    postRequest.setEntity(input); 
    
    HttpResponse response = httpClient.execute(postRequest); 
    
    String output; 
    
    if (response.getStatusLine().getStatusCode() != 200) { 
        throw new RuntimeException("Failed : HTTP error code : " 
          + response.getStatusLine().getStatusCode()); 
    } else { 
        HttpEntity entity = response.getEntity(); 
    
        if ((entity != null) && (entity.getContentLength() != 0)) { 
         // Use writing to output stream to prevent problems with chunked responses  
         ByteArrayOutputStream os = new ByteArrayOutputStream(); 
         entity.writeTo(os); 
         output = new String(os.toByteArray(),"UTF-8"); 
        } else { 
         // Handle case there is not content returned 
         System.out.println("Received no content (HTTP response code " + response.getStatusLine().getStatusCode() + " , reason: " + getReasonPhrase() +")"); 
        } 
    } 
    

    Der obige Code jedoch nicht löst das Problem, warum Sie bekomme eine leere Antwort. Ich habe nur die Tatsache, dass es passiert, ist eine elegantere Art und Weise.

    Ich bemerkte jedoch, dass Sie einen Benutzernamen in der Anfrage benötigen. Sind Sie sicher, dass der Benutzer auf dem Gerät existiert und im Falle eines nicht existierenden Benutzers, sollte etwas anderes zurückgegeben werden?

    1

    fand ich die Theorie der Leonidos nützlich: https://stackoverflow.com/a/19540249/6076711

    Und hier ist mein Ende-Lösung können Sie versuchen, den folgenden Code verwenden.

    string output = ""; 
    while(br.ready() && (br.readLine() != null)) 
    { 
        output += (String.valueOf(br.readLine()))+"\n"; 
    } 
    
    +0

    Ich denke, das macht Sinn, werde es versuchen und wiederherstellen, danke –

    +0

    wird froh sein, wenn es Ihnen dabei hilft. –

    +0

    Ich bin noch zu versuchen, diese Lösung aber .... auf jeden Fall ein guter Zeiger, ich respektiere die Forschung gemacht, daher Kopfgeld vergeben, wenn ich finde, es funktioniert als eine richtige Antwort zu markieren. –

    Verwandte Themen