2013-05-10 2 views
1

Я хочу создать спокойную веб-службу в java, используя jersey API и использовать его в приложении для Android. Я получил this question на SO, но он говорит о клиенте java, тогда как у меня есть клиент Android.IOException: Внутренний сервер Ошибка при попытке использования службы отдыха

Моя служба выглядит следующим образом:

@Path("/no") 
public class CheckNumber { 

@POST 
@Produces("application/json") 
@Consumes("application/json") 
public String getDetails(@PathParam("cNo") String cNo) { 
    String CardNo=""; 
    try { 
     JSONObject jsonObj = new JSONObject(cNo); 
     CardNo=jsonObj.getString("CardNo"); 
    } catch (ParseException e1) { 
     e1.printStackTrace(); 
    } 
    //Do something 
    return "someValue"; 
    } 
} 

Теперь приходит на стороне клиента:

public class MainActivity extends Activity { 

    JSONObject json = new JSONObject(); 
    String wsdl = "http://192.168.1.105:8080/restdemo/check/no/"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new RequestTask().execute("1234567890"); 

    } 

    class RequestTask extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... uri) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpResponse response; 
     String add = "{\"CardNo\":\"" + uri[0] + "\"}"; 
     HttpPost postMethod = new HttpPost(wsdl); 
     String responseString = null; 
     try { 
      postMethod.addHeader("Content-Type", "application/json"); 
      HttpEntity entity = new StringEntity(add); 
      postMethod.setEntity(entity); 
      response = httpclient.execute(postMethod); 
       StatusLine statusLine = response.getStatusLine(); 
       if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
        ByteArrayOutputStream out = new        ByteArrayOutputStream(); 
        response.getEntity().writeTo(out); 
        out.close(); 
        responseString = out.toString(); 
       } else { 
        response.getEntity().getContent().close(); 
        throw new IOException(statusLine.getReasonPhrase()); 
       } 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return responseString; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
     } 
    } 
} 

Я только начиная с остальных веб-служб. Я успешно создал образец службы отдыха, который потребляет строку и возвращает строку, и использовал эту службу в приложении для Android.

Но когда я пытаюсь передать строку json, используя метод POST. Это дает следующий журнал errorin:

java.io.IOException: Internal Server Error 
at com.example.restclient.MainActivity$RequestTask.doInBackground(MainActivity.java:85) 

где MainActivity.java:85 является throw new IOException(statusLine.getReasonPhrase());, который подразумевает, что statusLine.getStatusCode() не возвращается HttpStatus.SC_OK. Вместо этого он возвращает код состояния = .

Любая помощь приветствуется.

+0

Сначала попробуйте логи сервера, получить исключение. Неужели сервер работает с ошибкой или с перерывами? Вы воспроизвели ошибку с помощью не-android-реализации (java/wget/curl)? Вы видели данные HTTP, которые передаются по сети? (tcpdump -Xs1600 на сервере может помочь) –

+0

statusLine.getStatusCode() не возвращает HttpStatus.SC_OK – GAMA

+0

тоже попробовал с простым клиентом java. такая же ошибка. – GAMA

ответ

1

Это будет хорошо видеть на стороне сервера журнала, чтобы лучше понять.

Попробуйте создать объект с UTF8 и установить тип содержимого в строке объекта, а не в postMethod

StringEntity stringEntity = new StringEntity(myJsonDocStr, HTTP.UTF_8); 
stringEntity.setContentType("application/json"); 
+0

Я использовал «HttpPost postMethod = new HttpPost (« некоторый url ») \t \t \t \t postMethod.addHeader (« Content-Type »,« application/json »); \t \t \t \t HttpEntity entity = new StringEntity ("some String"); \t \t \t \t postMethod.setEntity (entity); ' – GAMA

1

Попробуйте этот код, он работает для меня

Boolean NetworkLostFlag = false;  

HttpParams httpParameters = new BasicHttpParams(); 

    int timeoutConnection = 10000; 

    HttpConnectionParams.setConnectionTimeout(httpParameters, 
      timeoutConnection); 

    int timeoutSocket = 12000; 

    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
    HttpClient httpclient = new DefaultHttpClient(httpParameters); 
    HttpPost httppost = new HttpPost(strUrl"); 
      try { 
     httppost.setEntity(new UrlEncodedFormEntity(new BasicNameValuePair(arg1, val1), "UTF-8")); 
     HttpResponse response = httpclient.execute(httppost); 

     HttpEntity entity = response.getEntity(); 

     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      try { 
       // do something useful 

       StringBuffer buffer = new StringBuffer(); 
       byte[] b = new byte[4096]; 
       for (int n; (n = instream.read(b)) != -1;) { 
        buffer.append(new String(b, 0, n)); 
       } 
       result = buffer.toString(); 

      } catch (Exception e) { 
       NetworkLostFlag = true; 
       // TODO: handle exception 
      } finally { 
       instream.close(); 
      } 
     } 
    } catch (Exception e) {   
     NetworkLostFlag = true; 
     e.printStackTrace(); 
    } 
+0

, но вы используете 'httppost.setEntity (новый UrlEncodedFormEntity (новый BasicNameValuePair (arg1, val1)," UTF-8 ")) ;, while я хочу использовать json string. – GAMA

Смежные вопросы