Android에서 HTTPClient를 사용하여 JSON으로 POST 요청을 보내는 방법은 무엇입니까?


111

HTTPClient를 사용하여 Android에서 JSON을 POST하는 방법을 알아 내려고합니다. 나는 이것을 한동안 알아 내려고 노력 해왔고, 온라인에서 많은 예제를 찾았지만 그들 중 어느 것도 작동하게 할 수 없습니다. 일반적으로 JSON / 네트워킹 지식이 부족하기 때문이라고 생각합니다. 많은 예제가 있다는 것을 알고 있지만 누군가가 실제 자습서를 알려줄 수 있습니까? 코드가 포함 된 단계별 프로세스와 각 단계를 수행하는 이유 또는 해당 단계가 수행하는 작업에 대한 설명을 찾고 있습니다. 복잡하고 단순한 의지 일 필요는 없습니다.

다시 말하지만, 많은 예제가 있다는 것을 알고 있습니다. 정확히 무슨 일이 일어나고 있는지, 왜 그런 식으로 진행되는지에 대한 설명이있는 예제를 찾고 있습니다.

누군가가 이것에 대해 좋은 Android 책에 대해 알고 있다면 알려주십시오.

@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();
    }
 }

작업 할 수없는 사례 중 하나를 게시 할 수 있습니까? 무언가가 작동하면 조각이 어떻게 서로 맞는지 배울 수 있습니다.
fredw

답변:


157

이 답변에서는 Justin Grammens가 게시 한 예제를 사용하고 있습니다.

JSON 정보

JSON은 JavaScript Object Notation을 나타냅니다. JavaScript에서 속성은 이와 같이 object1.name그리고 이와 같이 참조 될 수 있습니다 object['name'];. 이 기사의 예제는이 JSON 비트를 사용합니다.


이메일을 키로, foo@bar.com을 값으로 사용하는 Parts A 팬 객체

{
  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;
}

이 게시물에 대해 발생하는 질문이나 내가 명확하게 말하지 않았거나 여전히 혼란스러워하는 것에 대해 언급하지 않았다면 언제든지 의견을 보내주십시오.

(저스틴 그래 멘스가 승인하지 않으면 삭제하겠습니다. 그렇지 않다면 저스틴에 대해 쿨하게 감사합니다.)

최신 정보

코드 사용 방법에 대한 의견을 듣게되었고 반환 유형에 오류가 있음을 깨달았습니다. 메서드 시그니처는 문자열을 반환하도록 설정되었지만이 경우에는 아무것도 반환하지 않았습니다. 서명을 HttpResponse로 변경하고 HttpResponse응답 본문 얻기에 대한 이 링크를 참조 할 것입니다 . 경로 변수는 url이며 코드의 실수를 수정하기 위해 업데이트했습니다.


감사합니다 @Terrance. 그래서 다른 클래스에서 그는 나중에 JSONObjects로 변환 될 다른 키와 값을 가진 맵을 만들고 있습니다. 비슷한 것을 구현해 보았지만 맵에 대한 경험이 없습니다. 구현하려는 코드를 원래 게시물에 추가하겠습니다. 그 이후로 무슨 일이 벌어 졌는지에 대한 설명이 작성되었으며 하드 코딩 된 이름과 값으로 JSONObjects를 만들어 성공적으로 작동했습니다. 감사!

도와 드릴 수있어서 다행입니다.
Terrance

Justin은 그가 승인한다고 말합니다. 그는 와서 지금까지 자신의 의견을 남길 수있는 충분한 담당자가 있어야합니다.
Abizern

이 코드를 사용하고 싶습니다. 어떻게해야합니까? 경로 변수가 무엇이며 Java 끝에서 데이터를 가져올 수 있도록 반환해야 할 항목을 지정하십시오.
Prateek

3
이유가 없습니다 getJsonObjectFromMap(): JSONObject에는 다음을 취하는 생성자가 있습니다 Map. developer.android.com/reference/org/json/…
pr1001

41

@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를 사용해 보는 것이 좋습니다 .


내 앱은 HttpPut 메서드를 통해 데이터를 보내고 있습니다. 서버가 요청을 받으면 json 데이터로 응답합니다. json에서 데이터를 얻는 방법을 모르겠습니다. 말해주세요. 코드 .
kongkea

@kongkea GSON 라이브러리를 살펴보십시오 . JSON 파일을 Java 개체로 구문 분석 할 수 있습니다.
JJD 2013

@JJD 지금까지 당신이 제안한 것은 원격 서버에 데이터를 보내는 것이고 그에 대한 좋은 설명이지만 HTTP 프로토콜을 사용하여 JSON 객체를 구문 분석하는 방법을 알고 싶습니다. JSON 구문 분석으로 답변을 정교화 할 수 있습니까? 이것에 새로운 사람 모두에게 매우 도움이 될 것입니다.
AndroidDev 2014

@AndroidDev 이 질문은 클라이언트에서 서버로 데이터를 보내는 것이므로 새 질문 을여십시오. 여기에 링크를 남겨주세요.
JJD 2014

@JJD 당신은 추상 메소드를 호출 execute()하고 그것은 물론 실패
콘스탄틴 Konopko

33

HttpURLConnection대신 이것을 사용하는 것이 좋습니다 HttpGet. 으로는 HttpGet이미 안드로이드 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();
} 

5

이 작업에 너무 많은 코드가 있습니다. https://github.com/kodart/Httpzoid Is 라이브러리 는 내부적으로 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();

훌륭한 솔루션, 불행히도이 플러그인은 gradle 지원이 부족합니다. : /
electronix384128

3

HHTP 연결을 설정하고 RESTFULL 웹 서비스에서 데이터를 가져 오는 몇 가지 방법이 있습니다. 가장 최근의 것은 GSON입니다. 그러나 GSON으로 진행하기 전에 HTTP 클라이언트를 생성하고 원격 서버와 데이터 통신을 수행하는 가장 전통적인 방법에 대한 아이디어가 있어야합니다. HTTPClient를 사용하여 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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.