2016-03-31 8 views
3

私はPHPをビルドしたAPIを呼び出しています。コードは、私がstringBuilderオブジェクトで収集している下記のjsonを返します。問題は、いくつかのキャリアといくつかのキャリアで動作している/他のキャリア/無線LAN接続でJSONExceptionの文字の例外の例外をスローすることですが、これは入力文字列が空の場合は、stringBuilderオブジェクトが空であることを意味します。問題は、これらのエラーを投げているデバイスにアクセスできないということです。文字の0での入力の終了が一部のデバイスのエラー

次のコードで空の文字列が返され、一部の機能が正常に動作していないデバイスがありますが、これらのデバイスが異なるキャリアにある他の国の3GでもWi-Fiでもテストされています。論理的だったが、他のAPI呼び出しのために起こるdoest、すべてのAPI呼び出しのためだった場合はStringBuilderの

{
「ステータス」で次のように

  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); 
      } 

は、このAPIの呼び出しは、大きいサイズのJSON文字列を返します。 :1、 "駐車場":{
"名前": "ghgjjghghg"、 "コスト":3、 "OWNERID":29、 "アドレス": "XYZのPQR"、 "スロット":4、 「画像」:「d 4bc95c1dd031685746f2c3570788acf.jpg」、 "詳細": "gjhjghjgg"、 "設備": "gjhg"、 "ID":70、 "経度":73.7898023、 "LAT":19.9974533、 "タイプ":0 、 "使用可能":1 }、 "評価":0、 "ratingCount":0、 "所有者":{
"ID":29、 "ユーザ名": "[email protected]" 、 "パスワード": ""、 "フルネーム": "viのhdjh"、 "電話": "23434fddf"、 "ccNum":ヌル、 "CCTYPE":ヌル、 "タイプ":1、 "認証タイプ":1、 "イメージ": "582e3a77d76ae3203cfd6d6a346da429.jpg"、 "DNI": "ABC123"、 "アカウント": "ABCBANK" } }

私はいただきました!見当もつかない起こって、助けてください。任意の入力をいただければ幸いです。

+0

投稿したコードは何も返されません。 'stringBuilder'がnullであると言っていますか?それとも文字が入っていないのでしょうか?または、他の何か? – azurefrog

+0

はい@azurefrog stringbuilderがnullです –

+0

StringBuilderが* not * nullです。それは*空です*あなたが記述する条件は、入力が空の場合に起こります。あなたが正確でない場合、あなたを助けることは不可能です。 – EJP

答えて

3

あなたが投稿したコードは珍しいことは何もありません。そこに手がかりはありません。

あなたが症状について述べたことを要約しましょう。

  • 一部のデバイス/キャリアでは、特定のAPI呼び出しが失敗します。すべてのデバイス/キャリアではありません。

  • 上記と同じデバイス/キャリアについては、時間があれば他のAPI呼び出しがすべて機能します。

  • クライアント側のコードは、URLを除くすべてのケースで同じです。

私にとっては、これは、リクエストがどのように見えるかによって引き起こされるサーバー側の問題を指しています。しかしどちらの方法でも、サーバー側の要求と応答を調べ、サーバー側のログを調べることでこれを調べようとします。異なるデバイス/通信事業者からのリクエストに大きな違いがあるかどうかを確認してください。特にうまく動作しないものと動作しないものがあります。そして、サーバがそれらを送信したときに応答が空であるかどうかを確認します。

0

コードがなぜコンテンツの長さが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() +")"); 
    } 
} 

コード上記よりも大きいですが、問題を解決していないかどうか(文字列ビルダにそれを置く前に)確認することで改善することができます空の応答を得る。私はそれが起こっているという事実を扱うのはよりエレガントな方法です。

ただし、リクエストにはユーザー名が必要ですが、ユーザーがデバイスに存在していることを確認してください。存在しないユーザーの場合は、別のものが返されますか?

1

私はLeonidosの役に立つの理論が見つかりました:あなたは、次のコードを使用して試すことができます https://stackoverflow.com/a/19540249/6076711

そして、ここでは、ソリューションの私の終わりです。

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

これは意味があると思う、試して戻す、ありがとう –

+0

これがあなたを助けるなら嬉しいだろう。 –

+0

私はまだこのソリューションを試していますが、間違いなく良いポインター、私は研究を尊重し、それゆえに賞金を与えられました。 –

関連する問題