1

次のURLを受け取るasp.netでWebサービスを作成しました。

http://localhost:31804/api/defaultapi/login?empNum=123456&surname=Yusuf 

そして次の json {"$id":"1","EmployeeID":2,"Firstname":"Abayomi","Surname":"Yusuf","DepartmentID":1,"EmployeeNumber":"123456" を送信します}

これは私のブラウザで動作します。

今、私は Android アプリでその Web サービスを利用しようとしています。私はまったくの初心者で、ここで Andrew Barber によって作成された JSON パーサー クラスを使用していますAndroid で JSON を解析する方法(最後のコメント)

public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

// Making HTTP request
try {
    // defaultHttpClient
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(url);

    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();
    is = httpEntity.getContent();

} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            is, "iso-8859-1"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    is.close();
    json = sb.toString();
} catch (Exception e) {
    Log.e("Buffer Error", "Error converting result " + e.toString());
}

// try parse the string to a JSON object
try {
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString());
}

// return JSON String
return jObj;

}
}

これが私のコードでの使用方法です。ボタンには onClick イベントとして loadHome メソッドがあります

public class Main extends Activity {

private SharedPreferences employeeDetails;

private static final String EMP_ID = "EmployeeID";
private static final String EMP_NAME = "Firstname";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void loadHome(View view)
{
    EditText empNumEditText = (EditText)findViewById(R.id.employeeNumEditText);
    EditText surnameEditText = (EditText)findViewById(R.id.surnameEditText);
    TextView empNumError = (TextView)findViewById(R.id.empNumWarningTextView);
    TextView surnameError = (TextView)findViewById(R.id.surnameWarningTextView);
    TextView displayError = (TextView)findViewById(R.id.errorTextView);

    String employeeNumber = empNumEditText.getText().toString();
    String surname = surnameEditText.getText().toString();

    //ensure that the form was completed
    if((employeeNumber.length()>0) && (surname.length()>0))
    {
        try{
            String encodedEmployeeNumber = URLEncoder.encode(employeeNumber, "UTF-8");
            String encodedSurname = URLEncoder.encode(surname, "UTF-8");

            String loginURL = "localhost:31804/api/defaultapi/login?empNum=" + encodedEmployeeNumber + "&surname=" + encodedSurname;


            // Creating JSON Parser instance
            JSONParser jParser = new JSONParser();

            // getting JSON string from URL
            JSONObject json = jParser.getJSONFromUrl(loginURL);
            String empId = json.getString(EMP_ID);
            String empSur = json.getString(EMP_NAME);

            displayError.setText(empSur);
            }
        catch(Exception e){
            displayError.setText("Whoops - something went wrong!");
            e.printStackTrace();
        }

    } 
    else //display error messages
    {
        if (employeeNumber.length()>0){
            empNumError.setText(" ");
        }else{
            empNumError.setText("Enter Your Employee Number");
        }

        if (surname.length()>0){
            surnameError.setText(" ");
        }else{
            surnameError.setText("Enter Your Surname");
        }
    }

}

displayError textView でエラー (「おっと - 何か問題が発生しました!」) が発生し続けます。私は何を間違っていますか。

スタック トレースへのリンクは次のとおりです

4

3 に答える 3

0
String response = performRequestAsString(MY_URL, "GET");
Log.v("REsponse from web server",response);

// これを下に置く

public static String performRequestAsString(String url, String method) 
{
    String value = null;

    try {

        if (method == "POST") {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            Log.e("Request_Url", "" + url);
            HttpPost httpPost = new HttpPost(url);              
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            InputStream is = httpEntity.getContent();
            value = convertStreamToString(is);

        } else if (method == "GET") {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            Log.e("Request_Url", "" + url);
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            InputStream is = httpEntity.getContent();
            value = convertStreamToString(is);
        }

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return value;
}

// アクセス WebAPI 用

new GetData().execute();


private class GetData extends AsyncTask<String, String, String> {
        private ProgressDialog progressDialog;
        private String response = "";
        private JSONArray jRootArray;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(mContext);
            progressDialog.setMessage("Loading ...");
            progressDialog.setIndeterminate(false);
            progressDialog.setCancelable(false);
            progressDialog.show();

        }

        @Override
        protected String doInBackground(String... args) {

            response = WebAPIRequest.performRequestAsString(MY_URL, "GET");


            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    if (response == null) {

                        Toast.makeText(mContext, "Please Try Again",
                                Toast.LENGTH_SHORT).show();
                    } else {

                    }

                }
            });
            return null;
        }

        @Override
        protected void onPostExecute(String args) {
            progressDialog.dismiss();

        }
    }
于 2013-09-09T12:48:31.037 に答える
0

何か見落としがない限り、問題は URL にある可能性があります。あなたが指定している

String loginURL = "localhost:31804/api/defaultapi/login?empNum=" + encodedEmployeeNumber + "&surname=" + encodedSurname;

ホスト名「localhost」は常に 127.0.0.1 に解決されます。127.xxx アドレスはすべてローカル スタックを指す必要があります。したがって、電話で実行している場合は、これが電話になります。構成によっては、AVD で実行している場合は AVD である可能性があります。ルーティング可能なポートに変更してみて、違いが生じるかどうかを確認してください。

Windows を使用している場合は、コマンド プロンプトに移動して次を使用します。

ipconfig

LAN アダプタを探し、「localhost」の代わりに IPv4 アドレスを使用します。

于 2013-03-19T23:17:21.923 に答える