在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
Send "PUT" request in Android to rest api
提问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 authToken
is 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 的问题