Android에서 HTTP Client를 사용하여 JSON에서 POST 요청을 보내는 방법은 무엇입니까?
HTTP Client를 사용하여 Android에서 JSON을 POST하는 방법을 찾고 있습니다.한동안 이 문제를 해결하기 위해 노력했지만, 온라인에서 많은 예를 찾았지만, 어느 것 하나 제대로 작동하지 않습니다.일반적으로 JSON/네트워크 지식이 부족하기 때문이라고 생각합니다.많은 예가 있다는 것은 알지만, 실제 튜토리얼을 가르쳐 주실 수 있습니까?코드와 각 단계를 수행하는 이유, 또는 그 단계가 수행하는 작업에 대한 설명이 포함된 단계별 프로세스를 찾고 있습니다.복잡하고 단순한 의지일 필요는 없습니다.
많은 예가 있다는 것을 알고 있습니다.정확히 무슨 일이 일어나고 있는지, 왜 그렇게 하고 있는지에 대한 설명과 함께 사례를 찾고 있습니다.
이것에 관한 좋은 안드로이드 북을 아는 사람이 있으면 알려주세요.
@terrance의 도움에 다시 한 번 감사드립니다.아래에 설명한 코드는 다음과 같습니다.
public void shNameVerParams() throws Exception{
String path = //removed
HashMap params = new HashMap();
params.put(new String("Name"), "Value");
params.put(new String("Name"), "Value");
try {
HttpClient.SendHttpPost(path, params);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
이 답변에서 나는 저스틴 그래멘스가 올린 예를 사용하고 있다.
JSON에 대해서
JSON 자바스크립트JavaScript에서 은 이 JavaScript와 둘 다 할 수 .object1.name
object['name'];
JSON을 사용하다
★★★
로 하고 @bar@bar.com로
{
fan:
{
email : 'foo@bar.com'
}
}
동등한 는 '이러한 것'이 됩니다.fan.email;
★★★★★★★★★★★★★★★★★」fan['email'];
둘다 같은 수 있습니다.'foo@bar.com'
.
HttpClient 요구에 대해서
다음은 작성자가 HttpClient 요청을 작성하기 위해 사용한 것입니다.저는 이 모든 것에 대해 전문가라고 주장하지 않습니다.따라서 누군가 더 나은 용어를 사용할 수 있는 사람이 있다면 자유롭게 사용할 수 있습니다.
public static HttpResponse makeRequest(String path, Map params) throws Exception
{
//instantiates httpclient to make request
DefaultHttpClient httpclient = new DefaultHttpClient();
//url with the post data
HttpPost httpost = new HttpPost(path);
//convert parameters into JSON object
JSONObject holder = getJsonObjectFromMap(params);
//passes the results to a string builder/entity
StringEntity se = new StringEntity(holder.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");
//Handles what is returned from the page
ResponseHandler responseHandler = new BasicResponseHandler();
return httpclient.execute(httpost, responseHandler);
}
지도
「 」에 경우Map
Java Map 참조를 참조하십시오.요컨대 지도는 사전이나 해시와 비슷하다.
private static JSONObject getJsonObjectFromMap(Map params) throws JSONException {
//all the passed parameters from the post request
//iterator used to loop through all the parameters
//passed in the post request
Iterator iter = params.entrySet().iterator();
//Stores JSON
JSONObject holder = new JSONObject();
//using the earlier example your first entry would get email
//and the inner while would get the value which would be 'foo@bar.com'
//{ fan: { email : 'foo@bar.com' } }
//While there is another entry
while (iter.hasNext())
{
//gets an entry in the params
Map.Entry pairs = (Map.Entry)iter.next();
//creates a key for Map
String key = (String)pairs.getKey();
//Create a new map
Map m = (Map)pairs.getValue();
//object for storing Json
JSONObject data = new JSONObject();
//gets the value
Iterator iter2 = m.entrySet().iterator();
while (iter2.hasNext())
{
Map.Entry pairs2 = (Map.Entry)iter2.next();
data.put((String)pairs2.getKey(), (String)pairs2.getValue());
}
//puts email and 'foo@bar.com' together in map
holder.put(key, data);
}
return holder;
}
이 투고에 대해 궁금한 점이 있으시면, 또는 제가 뭔가 명확히 하지 않았거나, 당신이 아직 혼란스러워하는 부분에 대해 언급하지 않으셨다면, 부담없이 말씀해 주십시오.네 머릿속에 떠오르는 건 뭐든 간에 말이야
(Justin Grammens가 허락하지 않으면 나는 그것을 받아 들일 것이다.하지만 그렇지 않다면 저스틴이 냉정하게 대해줘서 고마워.)
갱신하다
마침 코드 사용법에 대한 의견을 듣고 반품 타입에 오류가 있음을 알게 되었습니다.메서드 시그니처는 문자열을 반환하도록 설정되었지만 이 경우 아무것도 반환하지 않았습니다.시그니처를 HttpResponse로 변경하여 HttpResponse의 Geting Response Body 링크를 참조하겠습니다.패스 변수는 url이며 코드 오류를 수정하기 위해 업데이트했습니다.
다음은 @Terrance의 답변에 대한 대체 솔루션입니다.변환을 쉽게 아웃소싱할 수 있습니다.Gson 라이브러리는 다양한 데이터 구조를 JSON 또는 그 반대로 변환하는 작업을 훌륭하게 수행합니다.
public static void execute() {
Map<String, String> comment = new HashMap<String, String>();
comment.put("subject", "Using the GSON library");
comment.put("message", "Using libraries is convenient.");
String json = new GsonBuilder().create().toJson(comment, Map.class);
makeRequest("http://192.168.0.1:3000/post/77/comments", json);
}
public static HttpResponse makeRequest(String uri, String json) {
try {
HttpPost httpPost = new HttpPost(uri);
httpPost.setEntity(new StringEntity(json));
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
return new DefaultHttpClient().execute(httpPost);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Gson 대신 Jackson을 사용해도 비슷합니다.또한 이 보일러 플레이트 코드를 많이 숨기고 있는 Retrofit도 확인해 보시기 바랍니다.경험이 많은 개발자에게는 RxAndroid를 사용해 보는 것을 추천합니다.
대신 이것을 사용하는 것을 추천합니다.HttpGet
Android API 레벨 22에서는 이미 권장되지 않습니다.
HttpURLConnection httpcon;
String url = null;
String data = null;
String result = null;
try {
//Connect
httpcon = (HttpURLConnection) ((new URL (url).openConnection()));
httpcon.setDoOutput(true);
httpcon.setRequestProperty("Content-Type", "application/json");
httpcon.setRequestProperty("Accept", "application/json");
httpcon.setRequestMethod("POST");
httpcon.connect();
//Write
OutputStream os = httpcon.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(data);
writer.close();
os.close();
//Read
BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"UTF-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
result = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
이 작업에는 코드가 너무 많습니다.이 라이브러리는 https://github.com/kodart/Httpzoid 에서 내부적으로 GSON을 사용하고 있으며 오브젝트와 연동되는 API를 제공합니다.모든 JSON 상세 내용이 숨겨집니다.
Http http = HttpFactory.create(context);
http.get("http://example.com/users")
.handler(new ResponseHandler<User[]>() {
@Override
public void success(User[] users, HttpResponse response) {
}
}).execute();
HHTP 접속을 확립하고 RESTFULL 웹 서비스에서 데이터를 가져오는 방법에는 몇 가지가 있습니다.가장 최근의 것은 GSON입니다.그러나 GSON으로 넘어가기 전에 HTTP 클라이언트를 생성하여 리모트서버와의 데이터 통신을 실행하는 가장 전통적인 방법을 알고 있어야 합니다.HTTP Client를 사용하여 POST와 GET 요구를 송신하는 방법에 대해 설명했습니다.
/**
* This method is used to process GET requests to the server.
*
* @param url
* @return String
* @throws IOException
*/
public static String connect(String url) throws IOException {
HttpGet httpget = new HttpGet(url);
HttpResponse response;
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 60*1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60*1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
try {
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
//instream.close();
}
}
catch (ClientProtocolException e) {
Utilities.showDLog("connect","ClientProtocolException:-"+e);
} catch (IOException e) {
Utilities.showDLog("connect","IOException:-"+e);
}
return result;
}
/**
* This method is used to send POST requests to the server.
*
* @param URL
* @param paramenter
* @return result of server response
*/
static public String postHTPPRequest(String URL, String paramenter) {
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 60*1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60*1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost(URL);
httppost.setHeader("Content-Type", "application/json");
try {
if (paramenter != null) {
StringEntity tmp = null;
tmp = new StringEntity(paramenter, "UTF-8");
httppost.setEntity(tmp);
}
HttpResponse httpResponse = null;
httpResponse = httpclient.execute(httppost);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream input = null;
input = entity.getContent();
String res = convertStreamToString(input);
return res;
}
}
catch (Exception e) {
System.out.print(e.toString());
}
return null;
}
언급URL : https://stackoverflow.com/questions/6218143/how-to-send-post-request-in-json-using-httpclient-in-android
'programing' 카테고리의 다른 글
둘 중 하나 또는 둘 중 하나(다른 두 필드 중 하나)를 모두 필요로 하지 않는 방법은 무엇입니까? (0) | 2023.03.15 |
---|---|
스프링 부트:단위시험에서 액화효소로 시험데이터를 설정하는 방법 (0) | 2023.03.15 |
Elastic Search를 사용하여 여러 필드에서 검색 (0) | 2023.03.15 |
facebook과 같이 로드하는 동안 플레이스홀더를 작성하는 방법 (0) | 2023.03.15 |
클릭 시 Ajax를 사용하여 Wordpress Post를 로드하는 방법 (0) | 2023.03.15 |