1

jersey APIを使用して Java で安らかな Web サービスを作成し、それを Android アプリケーションで使用したいと考えています。SOでこの質問を受けましたが、Androidクライアントを持っているのに対し、Javaクライアントについて話しています。

私のサービスは次のようになります。

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

私は残りのWebサービスから始めたばかりです。文字列を消費して文字列を返すサンプルの残りのサービスを正常に作成し、このサービスを Android アプリで使用しました。

しかし、POST メソッドを使用して json 文字列を渡そうとすると。次のエラー ログが表示されます。

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

MainActivity.java:85は、それが返されていないthrow new IOException(statusLine.getReasonPhrase());ことを意味します。代わりに status code = 500を返しています。statusLine.getStatusCode()HttpStatus.SC_OK

どんな助けでも感謝します。

4

2 に答える 2

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();
    }
于 2013-05-10T10:21:43.090 に答える
1

サーバー側のログを見て理解を深めるとよいでしょう。

UTF8 でエンティティを作成し、postMethod ではなく文字列エンティティに content-type を設定してみてください。

StringEntity stringEntity = new StringEntity(myJsonDocStr, HTTP.UTF_8);
stringEntity.setContentType("application/json");
于 2013-05-10T14:29:18.067 に答える