1

データベースのCRUD操作を公開するasp.netmvc4で作成したWebAPIがあり、このデータを操作するためのAndroidアプリを作成しています。

私が直面している問題は、http PUTリクエスト(/ api / products / id)によって公開される更新操作のjsonパーサーにあります

これが私が例から得た使用しているパーサーです。代わりにPUTを実行するようにPOSTセクションを変更しました。

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static JSONArray jArr = null;
static String json = "";

// constructor
public JSONParser() {

}

// function get json from url
    // by making HTTP POST or GET method
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if (method == "PUT") {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPut httpPut = new HttpPut(url);
                httpPut.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPut);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

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

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                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;

    }
}

PUT操作を実行しようとすると、レコードは更新されますが、実行しようとすると、アプリがnullポインター例外でクラッシュしますis = httpEntity.getContent();

物事がどのように行われるべきかについての詳細な説明が見つからないため、これで何が間違っているのかを正確に理解しようとして問題が発生しています。私が持っているのはランダムな例だけで、どれもG​​ETを超えていません。およびPOST操作。

参考までに、これはパーサーを呼び出す非同期タスクです。

class SaveProductDetails extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... args) {
        String id = mTitleText.getText().toString();
        String desc = mBodyText.getText().toString();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair(KEY_ID, id));
        params.add(new BasicNameValuePair(KEY_DESC, desc));
        JSONParser parser = new JSONParser();
        JSONObject json = parser.makeHttpRequest(URL + id, "PUT", params);

        try {
            Integer success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                // successfully updated
                Intent i = getIntent();
                // send result code 100 to notify about product update
                setResult(100, i);
                finish();
            } else {
                // failed to update product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;

    }
}

私は何が間違っているのですか?

4

1 に答える 1

2

3つのこと(そのうちの2つがより重要です)。

最初に(重要)、応答本文を処理する前に、要求が成功したかどうかを判断する必要があります。コードの構造を考えると、取得メソッドの最初にステータスコード変数を宣言し、それぞれの後に設定することをお勧めしますexecute

HttpResponse httpResponse = httpClient.execute(httpPut);
status = httpResponse.getStatusLine().getStatusCode();

次に(重要)、応答エンティティがnullでないことを確認してから、メソッドを呼び出す必要があります。EntityUtils全体として、クラスを使用して応答を処理することで、より良いサービスを受けることができます。

httpEntity = httpResponse.getEntity(); // Declare httpentity outside your try/catch
is = httpEntity.getContent();          // Remove this line entirely

その後、エンティティは次のように処理されます。

try {
    if(status == HttpStatus.SC_OK) {
        json = httpentity != null ?
            EntityUtils.toString(httpentity, "iso-8859-1") : null;
    } else {
        Log.e("Server responded with error status " + status);
    }
} catch (Exception e) {
    Log.e("Buffer Error", "Error converting result " + e.toString());
}

最後に(非常に重要です)、パーサークラスのすべての静的変数を削除し、代わりにメソッドのローカル変数にする必要があります。

于 2013-03-20T10:43:42.323 に答える