3

服务器接受两个参数:StringJSON。提示,正确我JSON在 POST 请求中传输和字符串?

try {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("my_url");
    List parameters = new ArrayList(2);
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("par_1", "1");
    jsonObject.put("par_2", "2");
    jsonObject.put("par_3", "3");
    parameters.add(new BasicNameValuePair("action", "par_action"));
    parameters.add(new BasicNameValuePair("data", jsonObject.toString()));
    httpPost.setEntity(new UrlEncodedFormEntity(parameters));
    HttpResponse httpResponse = httpClient.execute(httpPost);
    Log.v("Server Application", EntityUtils.toString(httpResponse.getEntity())+" "+jsonObject.toString());

} catch (UnsupportedEncodingException e) {
    Log.e("Server Application", "Error: " + e);
} catch (ClientProtocolException e) {
    Log.e("Server Application", "Error: " + e);
} catch (IOException e) {
    Log.e("Server Application", "Error: " + e);
} catch (JSONException e) {
    e.printStackTrace();
}
4

2 回答 2

14

我不确定您的问题是什么,但这是我发送 JSON 的方式(使用您的数据示例)。

Android/JSON 构建:

JSONObject jo = new JSONObject();
jo.put("action", "par_action");
jo.put("par_1", "1");
jo.put("par_2", "2");
jo.put("par_3", "3");

Android / 发送 JSON:

URL url = new URL("http://domaintoreceive.com/pagetoreceive.php");

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url.toURI());

// Prepare JSON to send by setting the entity
httpPost.setEntity(new StringEntity(jo.toString(), "UTF-8"));

// Set up the header types needed to properly transfer JSON
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Accept-Encoding", "application/json");
httpPost.setHeader("Accept-Language", "en-US");

// Execute POST
response = httpClient.execute(httpPost);

PHP/服务器端:

<?php
if (file_get_contents('php://input')) {
    // Get the JSON Array
    $json = file_get_contents('php://input');
    // Lets parse through the JSON Array and get our individual values
    // in the form of an array
    $parsedJSON = json_decode($json, true);

    // Check to verify keys are set then define local variable, 
    // or handle however you would normally in PHP.
    // If it isn't set we can either define a default value
    // ('' in this case) or do something else
    $action = (isset($parsedJSON['action'])) ? $parsedJSON['action'] : '';
    $par_1 = (isset($parsedJSON['par_1'])) ? $parsedJSON['par_1'] : '';
    $par_2 = (isset($parsedJSON['par_2'])) ? $parsedJSON['par_2'] : '';
    $par_3 = (isset($parsedJSON['par_3'])) ? $parsedJSON['par_3'] : '';

    // Or we could just use the array we have as is
    $sql = "UPDATE `table` SET 
                `par_1` = '" . $parsedJSON['par_1'] . "',
                `par_2` = '" . $parsedJSON['par_2'] . "',
                `par_3` = '" . $parsedJSON['par_3'] . "'
            WHERE `action` = '" . $parsedJSON['action'] . "'";
}
于 2013-04-19T20:09:34.050 回答
2

I really see much better having a RestClient class in order to have more code scalability,but basically I think your code is good, for basic solutions.Here I post a proper RestClient class, wich implements a POST or a GET:

public class RestClient {

private ArrayList<NameValuePair> params;
private ArrayList<NameValuePair> headers;
private String url;
private String response;
private int responseCode;

public String GetResponse()
{
    return response;
}

public int GetResponseCode()
{
    return responseCode;
}

public RestClient(String url)
{
    this.url = url;
    params = new ArrayList<NameValuePair>();
    headers = new ArrayList<NameValuePair>();
}

public void AddParam(String name, String value)
{
    params.add(new BasicNameValuePair(name, value));
}

public void AddHeader(String name, String value)
{
    headers.add(new BasicNameValuePair(name, value));
}

public void Execute(RequestType requestType) throws Exception
{
    switch(requestType)
    {
        case GET:
        {
            String combinedParams = "";
            if (!params.isEmpty())
            {
                combinedParams += "?";
                for (NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");

                    if  (combinedParams.length() > 1)
                        combinedParams += "&" + paramString;
                    else
                        combinedParams += paramString;
                }
            }
            HttpGet request = new HttpGet(url + combinedParams);

            for (NameValuePair h: headers)
                request.addHeader(h.getName(),h.getValue());

            ExecuteRequest(request, url);
            break;
        }
        case POST:
        {
            HttpPost request = new HttpPost(url);

            for (NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }

            if(!params.isEmpty()){
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            }

            ExecuteRequest(request, url);
            break;
        }
    }
}

public void ExecuteRequest(HttpUriRequest request, String url) 
{
    HttpClient client = new DefaultHttpClient();
    HttpResponse httpResponse;
    try
    {
        httpResponse = client.execute(request);
        responseCode = httpResponse.getStatusLine().getStatusCode();

        HttpEntity entity = httpResponse.getEntity();

        if (entity != null)
        {
            InputStream in = entity.getContent();
            response = ConvertStreamToString(in);
            in.close();
        }
    }
    catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
        } catch (IOException e) {
        Log.e("REST_CLIENT", "Execute Request: " + e.getMessage()); 
        client.getConnectionManager().shutdown();

        e.printStackTrace();
    }       
}

private String ConvertStreamToString(InputStream in)
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try 
    {
        while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    } 
    finally 
    {
        try 
        {
            in.close();
        } 
        catch (IOException e) 
        {
             Log.e("REST_CLIENT", "ConvertStreamToString: " + e.getMessage());  
            e.printStackTrace();
        }
    }
    return sb.toString();
}

With this you can easily do a POST like this, for example:

RestClient rest = new RestClient(url)
rest.addHeader(h.name,h.value);
rest.Execute(RequestType.POST);
于 2013-04-19T20:26:21.253 回答