在Android中发送“PUT”请求以休息api

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25782582/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:43:40  来源:igfitidea点击:

Send "PUT" request in Android to rest api

androidjsonrestandroidhttpclient

提问by Emmanuel Guther

I have an android application that consulting and insert in a web service rest-ful. all this through apache HTTPClient and JSON.

我有一个 android 应用程序,可以咨询并插入一个 web 服务休息。这一切都是通过 apache HTTPClient 和 JSON 实现的。

so for example I insert a new user into db.

所以例如我在数据库中插入一个新用户。

HttpClient httpclient = new DefaultHttpClient();
        // 2. make POST request to the given URL
            HttpPost httpPost = new HttpPost(url);
            String json = "";
            // 3. build jsonObject
            JSONObject jsonObject2 = new JSONObject();
            jsonObject2.put("name", name);
            jsonObject2.put("number", num);
         // 4. convert JSONObject to JSON to String
            json = jsonObject.toString();
        // 5. set json to StringEntity
            StringEntity se = new StringEntity(json);
        // 6. set httpPost Entity
            httpPost.setEntity(se);
        // 7. Set some headers to inform server about the type of the content   
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPost);

all perfectly created, well now I want to use the method that I created in the rest api, method PUT to overwrite for example the name of the user with ID 5 If I want to do a get enter my url + / ID and get a particular user. to "PUT" I do this but does not work.

一切都完美创建,现在我想使用我在其余 api 中创建的方法,方法 PUT 来覆盖例如 ID 为 5 的用户名如果​​我想做一个获取,请输入我的 url + / ID 并获取一个特定用户。“PUT”我这样做但不起作用。

 @Override
    protected String doInBackground(String... params) {
        InputStream inputStream = null;
        String result = ""; 

        try {
            // 1. create HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            // 2. make POST request to the given URL

            HttpPut httpPut = new    
            HttpPut("http://000.000.0.000:0000/xxxxxx/webresources/net.xxxxx.users/5");
            String json = "";
            //              // 3. build jsonObject
            //              JSONObject jsonObject2 = new JSONObject();
            //              jsonObject2.put("idGuarderias", idG);
            // 3. build jsonObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name",newName);
            //      jsonObject.put("guarderiasIdGuarderias",jsonObject2);
            json = jsonObject.toString();
            StringEntity se = new StringEntity(json);
            // 6. set httpPost Entity
            httpPut.setEntity(se);
            // 7. Set some headers to inform server about the type of the content   
            httpPut.addHeader("Accept", "application/json");
            httpPut.addHeader("Content-type", "application/json");
            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPut);

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

What changes should I make?

我应该做哪些改变?

回答by yhel

Maybe you can try this:

也许你可以试试这个:

@Override
protected String doInBackground(String... params) {
    InputStream inputStream = null;
    String result = ""; 

    try {
        // 1. create HttpClient
        HttpClient httpclient = new DefaultHttpClient();
        // 2. make POST request to the given URL

        HttpPut httpPut = new    
        HttpPut("http://000.000.0.000:0000/xxxxxx/webresources/net.xxxxx.users/5");
        String json = "";
        //              // 3. build jsonObject
        //              JSONObject jsonObject2 = new JSONObject();
        //              jsonObject2.put("idGuarderias", idG);
        // 3. build jsonObject
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name",newName);
        //      jsonObject.put("guarderiasIdGuarderias",jsonObject2);
        json = jsonObject.toString();
        StringEntity se = new StringEntity(json);
        // 6. set httpPost Entity
        httpPut.setEntity(se);
        // 7. Set some headers to inform server about the type of the content   
        httpPut.addHeader("Accept", "application/json");
        httpPut.addHeader("Content-type", "application/json");
        // 8. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPut);


        //Try to add this
       inputStream = httpResponse.getEntity().getContent();

        if(inputStream != null)
            result = convertInputStreamToString(inputStream);
        else
            result = "Did not work!";

    } catch (Exception e) {
        //Log.d("InputStream", e.getLocalizedMessage());
    }
    return result;
}

回答by Emmanuel Guther

I solved my problem with the following code, thanks for replying.

我用以下代码解决了我的问题,感谢您的回复。

@Override
    protected String doInBackground(String... params) {
        InputStream inputStream = null;
        String result = ""; 

        try {
            // 1. create HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            // 2. make POST request to the given URL
            HttpPut httpPUT = new    
                   HttpPut("http://xxx.xx.x.xxx:xxxx/xxxxxxxy/webresources/net.xxxxxx.users/3");
            String json = "";
            // 3. build jsonObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("idUser","3");
            jsonObject.put("name","Mark");
            jsonObject.put("pass","1234");
            jsonObject.put("rol","554");
            jsonObject.put("usuario","mark");




            // 4. convert JSONObject to JSON to String
            json = jsonObject.toString();

            // 5. set json to StringEntity
            StringEntity se = new StringEntity(json);
            // 6. set httpPost Entity
            httpPUT.setEntity(se);
            // 7. Set some headers to inform server about the type of the content   
            httpPUT.setHeader("Accept", "application/json");
            httpPUT.setHeader("Content-type", "application/json");
            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPUT);
            // 9. receive response as inputStream
            //                  inputStream = httpResponse.getEntity().getContent();
            //                  // 10. convert inputstream to string
            //                  if(inputStream != null)
            //                      result = convertInputStreamToString(inputStream);
            //                  else
            //                      result = "Did not work!";
        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

        return "EXITO!";
    }

They should put the id in the url, and also overwrite all parameters including the id

他们应该将 id 放在 url 中,并覆盖包括 id 在内的所有参数

回答by Niko Adrianus Yuwono

Try this code : You can add your parameter in the jsonObject object

试试这个代码:您可以在 jsonObject 对象中添加您的参数

JSONObject jsonObject = new JSONObject();
jsonObject.put("name",newName);
try {
    HttpResponse response;
    HttpParams httpParameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT);
    HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT);
    HttpClient httpClient = new DefaultHttpClient(httpParameters);
    HttpPut putConnection = new HttpPut(url);
    putConnection.setHeader("json", jsonObject.toString());
    StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
            "application/json"));
    putConnection.setEntity(se);
    try {
        response = httpClient.execute(putConnection);
        String JSONString = EntityUtils.toString(response.getEntity(),
                "UTF-8");
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (Exception e) {
    e.printStackTrace();
}

回答by ik024

Hope this helps some one: Note here authTokenis optional

希望这对某人有所帮助:注意这里authToken是可选的

public JSONObject makePutRequest(String path, String params, String authToken) {

    try {
        //instantiates httpclient to make request
        @SuppressWarnings("deprecation")
        DefaultHttpClient httpclient = new DefaultHttpClient();

        //url with the post data
        @SuppressWarnings("deprecation")
        HttpPut httpost = new HttpPut(path);
        if (authToken != null) {
            httpost.setHeader("X-Auth-Token", authToken);
        }
        //passes the results to a string builder/entity
        @SuppressWarnings("deprecation")
        StringEntity se = new StringEntity(params.toString());

        //sets the post request as the resulting string
        httpost.setEntity(se);
        //sets a request header so the page receving the request
        //will know what to do with it
        httpost.setHeader("Accept", "application/json");
        httpost.setHeader("Content-type", "application/json");
        response = httpclient.execute(httpost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

        if (is != null) {

            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        }
        jsonObject = new JSONObject(result);
        Log.i("Response", "" + jsonObject.toString());
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return jsonObject;

}

回答by Firdosh

Here is my code.

这是我的代码。

add dependency in gradle

在gradle中添加依赖

compile 'com.squareup.okhttp:okhttp:2.6.0'

编译'com.squareup.okhttp:okhttp:2.6.0'

HttpUtils.class

HttpUtils.class

public class HttpUtils {
    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");
    public static OkHttpClient client = new OkHttpClient();

    /**
     * function for get url of webservice
     *
     * @param url
     * @return
     * @throws IOException
     */
    public static String getRun(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();
        client.setConnectTimeout(90, TimeUnit.SECONDS);
        client.setReadTimeout(90, TimeUnit.SECONDS);
        client.setWriteTimeout(90, TimeUnit.SECONDS);
        Response response = client.newCall(request).execute();
        return response.body().string();
    }

    /**
     * function for post url of webservice
     *
     * @param type
     * @param formBody
     * @return
     * @throws IOException
     */

    public static String postRun(String type, RequestBody formBody) throws IOException {

        Response response = null;

        Request request = new Request.Builder()
                .url(type)
                .post(formBody)
                .build();
        client.setConnectTimeout(90, TimeUnit.SECONDS);
        client.setReadTimeout(90, TimeUnit.SECONDS);
        client.setWriteTimeout(90, TimeUnit.SECONDS);
        response = client.newCall(request).execute();
        return response.body().string();
    }

}

Registration.class

注册.class

    public class Registration extends AppCompatActivity {

    private String mStrSocialLoginResponse;
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.registration); 
            new MyAsyncTask().execute();
        }

        public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected Void doInBackground(Void... params) {

                    try {
                        RequestBody formBody = new FormEncodingBuilder()
                                .add("user_id", "1")
                                .build();

                        mStrSocialLoginResponse = HttpUtils.postRun("your url", formBody);
                        if (mStrSocialLoginResponse != null) {
                            try {
                                JSONObject jsonObjectLogin = new JSONObject(mStrSocialLoginResponse);
                                if (jsonObjectLogin.has("code")) {
                                    mCode = jsonObjectLogin.getInt("code");
                                    if (mCode == 1) {
                                        if (jsonObjectLogin.has("image_path")) {
                                            strImagePath = jsonObjectLogin.getString("image_path");
                                        }
                                        if (jsonObjectLogin.has("data")) {
                                            JSONArray jsonArray = jsonObjectLogin.getJSONArray("data");
                                            for (int i = 0; i < jsonArray.length(); i++) {
                                                modelSongs = new ModelSongs();
                                                JSONObject jsonObj = jsonArray.getJSONObject(i);
                                                if (jsonObj.has("id")) {
                                                    strSongId = jsonObj.getString("id");
                                                    modelSongs.setId(strSongId);
                                                    Log.e(TAG, "SongId " + modelSongs.getId());
                                                }
                                                if (jsonObj.has("song")) {
                                                    strSongs = jsonObj.getString("song");
                                                    modelSongs.setSong(strAudioPath + strSongs);
                                                    Log.i("GetSOng", "++" + modelSongs.getSong());
                                                }
                                                if (jsonObj.has("image")) {
                                                    strImage = jsonObj.getString("image");
                                                    modelSongs.setImage(strImagePath + strImage);
                                                }

                                                }
                                               mArrayListSongs.add(modelSongs);
                                                }
                                            }
                                        }
                                    }
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }//if close

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    super.onPostExecute(aVoid);
                }
            }
}

Hope this will help you :-)

希望能帮到你 :-)

this link will also help to solve problem json parsing from url

此链接还将有助于解决从 url 解析 json 的问题