簡體   English   中英

在Android中發出POST請求

[英]Making a POST request in Android

我正在嘗試向我的Android應用程序中的服務器發出POST請求,但沒有發生。 下面是代碼-

try{

        View p = (View) v.getRootView();

        EditText usernamefield = (EditText)p.findViewById(R.id.username);
        String username = usernamefield.getText().toString();
        EditText passwordfield = (EditText)p.findViewById(R.id.pass);
        String password = passwordfield.getText().toString();

        String apiKey = "ac96d760cb3c33a1ee988750b0b2fd12";
        String secret = "cd9118e8d1d32d003e0ed54a202c2bf8";

        Log.i(TAG,password);

        String authToken = computeMD5hash(username.toLowerCase()).toString()+computeMD5hash(password).toString();
        String authSig = computeMD5hash("api_key"+apiKey+"authToken"+authToken+"method"+"auth.getMobileSession"+"username"+username+secret).toString();

        Log.i(TAG,authToken);

        HttpClient client = new DefaultHttpClient();
        Log.i(TAG,"after client1");
        HttpPost post = new HttpPost("http://ws.audioscrobbler.com/2.0/");
        Log.i(TAG,"after client2");
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("method", "auth.getMobileSession"));
        nameValuePairs.add(new BasicNameValuePair("api_key", apiKey));
        nameValuePairs.add(new BasicNameValuePair("api_sig", authSig));
        nameValuePairs.add(new BasicNameValuePair("format", "json"));
        nameValuePairs.add(new BasicNameValuePair("authToken", authToken));
        nameValuePairs.add(new BasicNameValuePair("username", username));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        Log.i(TAG,post.getURI().toString()); //logs the URL
        HttpResponse response = client.execute(post);

        int status = response.getStatusLine().getStatusCode();
        Log.i(TAG,"Status code is"+status);

        Log.i(TAG,"after post");

        InputStream ips  = response.getEntity().getContent();
        BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));
        if(response.getStatusLine().getStatusCode()!= org.apache.commons.httpclient.HttpStatus.SC_OK)
        {
            Log.i(TAG,"bad http response");
            Toast.makeText(getApplicationContext(),"bad httpcode",Toast.LENGTH_LONG).show();
            throw new Exception(response.getStatusLine().getReasonPhrase());
        }
        StringBuilder sb = new StringBuilder();
        String s;
        while(true)
        {
            s = buf.readLine();
            if(s==null || s.length()==0)
                break;
            sb.append(s);

        }
        buf.close();
        ips.close();
     System.out.print(sb.toString());
    }
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }
    catch(NoSuchAlgorithmException e)
    {

    }
    catch(Exception e){

    }

該代碼將一直執行到Log.i(TAG,post.getURI().toString())日志語句。 它將打印出所創建的URL- http://ws.audioscrobbler.com/2.0/ 沒有附加參數(很奇怪)。

我不知道使用NameValuePairs向URL添加參數的實現有什么問題。

我確實有一種簡單的方法將數據發布到服務器。 請使用它,讓我知道這是否對您有用:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("method", "auth.getMobileSession"));
nameValuePairs.add(new BasicNameValuePair("api_key", apiKey));
nameValuePairs.add(new BasicNameValuePair("api_sig", authSig));
nameValuePairs.add(new BasicNameValuePair("format", "json"));
nameValuePairs.add(new BasicNameValuePair("authToken", authToken));
nameValuePairs.add(new BasicNameValuePair("username", username));
//call to method
JSONObject obj = makeHttpRequest(nameValuePairs, "http://ws.audioscrobbler.com/2.0/", "POST");

public static JSONObject makeHttpRequest(List<NameValuePair> params, String url, String method) {
        InputStream is = null;
        JSONObject jObj = null;
        String json = "";
        // Making HTTP request
        try {
            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient            
                url = url.trim();
                Log.e("FETCHING_DATA_FROM",""+url.toString());
                HttpPost httpPost = new HttpPost(url);

                HttpParams httpParameters = new BasicHttpParams();
                // Set the timeout in milliseconds until a connection is established.
                int timeoutConnection = 600000;
                HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
                // Set the default socket timeout (SO_TIMEOUT) 
                // in milliseconds which is the timeout for waiting for data.
                int timeoutSocket = 600000;
                HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);       
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);


                httpPost.setEntity(new UrlEncodedFormEntity(params,"utf-8"));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }else if(method == "GET"){
                // request method is GET

                if(params!=null){
                    String paramString = URLEncodedUtils.format(params, "utf-8");
                    url += "?" + paramString;
                }

                HttpGet httpGet = new HttpGet(url);
                Log.e("FETCHING_DATA_FROM",""+url.toString());

                HttpParams httpParameters = new BasicHttpParams();
                // Set the timeout in milliseconds until a connection is established.
                int timeoutConnection = 600000;
                HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
                // Set the default socket timeout (SO_TIMEOUT) 
                // in milliseconds which is the timeout for waiting for data.
                int timeoutSocket = 600000;
                HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);       
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace(); 
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        return jObj;
    }   

您必須將這段代碼包裝在try catch塊中,因為這里可能引發一些異常。 關於哪個是我不確定的問題,但是這是一些可能導致問題的常見問題,您需要提供更多信息,然后才能看到它是哪個:1)在較新版本的Android上,如果您進行thisw調用在主UI線程中,它將引發NetworkOnMainThread異常。 您必須在后台線程上執行聯網代碼。 2)您未在清單中聲明Internet許可,因此它將引發安全異常。

您需要查看logcat中的異常或在try / catch的catch部分中中斷。 如果您的漁獲看起來像這樣:

catch(Exception e)
{
}

然后它將默默地吃掉異常,並且不會給您任何問題的跡象。

只需嘗試使用JsonStringer.Like:

HttpPost request = new HttpPost("http://ws.audioscrobbler.com/2.0/something_here");
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
JSONStringer vm;
try {
     vm = new JSONStringer().object().key("method")
    .value("auth.getMobileSession").key("api_key").value(apikey)
    .key("api_sig")          .value(authSig).key("format").value("json").key(authToken).value(authToken).key("username").value(username)
    .endObject();
StringEntity entity = new StringEntity(vm.toString());
request.setEntity(entity);
 HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);

就像Kaediil所說的那樣,在響應代碼中加入try and catch子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM