同时使用POST和GET在AsyncTask的http请求 [英] Using both POST and GET http request in AsyncTask

查看:262
本文介绍了同时使用POST和GET在AsyncTask的http请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发一个应用程序,这个过程从服务器获取数据

I am developing an application where the process to get data from server is

第1步:使用HTTP POST特定头内容给url post请求

Step 1: Post a request using Http POST to url with specific header content.

第2步:作为回报,我会得到一个链接,我已经构建成一个完整的URL的一部分

Step 2: In return, i will get part of a link, which i have to construct into a full URL

科学技术审查小组3:现在,通过使用这个网址HTTP GET方法来获取数据。

Strp 3: Now, pass this URL using Http GET method to obtain the data.

现在我想实现这一点使用以下code,

Now i am trying to achieve this using following code,

@Override
    protected String doInBackground(String... params) 
    {
        try 
        {
            /** Performing POST method to url to obtain link for data**/
            HttpClient httpClient = HttpClientConstant.getThreadSafeClient();
            HttpPost httpPost = new HttpPost(CHANNEL_LANGUAGE_SENTIMENT_URL);
            httpPost.setEntity(new ByteArrayEntity(POST_URL_VALUES.toString().getBytes("UTF8")));
            HttpResponse response = httpClient.execute(httpPost);
            if(response!=null)
            {
                OBTAIN_URL_LINK = convertJsonToString(response.getEntity().getContent()).toString();
                /** getting the link in OBTAIN_URL_LINK**/
                System.out.println("Response: " + OBTAIN_URL_LINK);
                try
                {
                    /** Constructing the URL**/
                    JSONObject mainStringJSON = new JSONObject(OBTAIN_URL_LINK);
                    REFINED_URL_LINK = mainStringJSON.getString("poll_url");
                    REQUIRED_URL_LINK = PREDEFINED_URL_LINK + REFINED_URL_LINK;
                    System.out.println("URL to USE: " + REQUIRED_URL_LINK);

                    /** Performing GET method to obtain the Data**/
                    HttpClient channelHttpClient = HttpClientConstant.getThreadSafeClient();
                    HttpGet channelHttpGet = new HttpGet(REQUIRED_URL_LINK);
                    HttpResponse channelHttpResponse = channelHttpClient.execute(channelHttpGet);

                    /** Reading the JSON response and stroing in string**/
                    BufferedReader channelHttpReader = new BufferedReader(new InputStreamReader(channelHttpResponse.getEntity().getContent(), "UTF-8") );
                    CHANNEL_LANGUAGE_RESPONSE_JSON = channelHttpReader.readLine();
                    System.out.println(CHANNEL_LANGUAGE_RESPONSE_JSON);
                    if(CHANNEL_LANGUAGE_RESPONSE_JSON != null)
                    {   
                        try
                        {       
                            JSONObject mainJson = new JSONObject(CHANNEL_LANGUAGE_RESPONSE_JSON);
                            JSONObject dataJson = mainJson.getJSONObject("data");
                            //JSONObject dataJson = new JSONObject().getJSONObject("data");
                            /** Values for Channel Graphs**/
                            JSONObject channelJson = dataJson.getJSONObject("category");
                            int twitterValues = channelJson.getInt("twitter");

当我debugg的应用程序,它做工精细,它显示的数据。但是当我运行它的崩溃和给我这个应用,

When i debugg the application, it working fine and it shows the data. But when i run the application it's crashing and giving me this,

10-07 09:03:10.517: I/System.out(1330): org.json.JSONException: No value for data
10-07 09:03:10.517: I/System.out(1330):     at org.json.JSONObject.get(JSONObject.java:354)
10-07 09:03:10.517: I/System.out(1330):     at org.json.JSONObject.getJSONObject(JSONObject.java:569)
10-07 09:03:10.557: I/System.out(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment$GetChannelAndLanguageData.doInBackground(ChannelsAndLanguageFilterFragment.java:164)
10-07 09:03:10.597: I/System.out(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment$GetChannelAndLanguageData.doInBackground(ChannelsAndLanguageFilterFragment.java:1)
10-07 09:03:10.597: I/System.out(1330):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-07 09:03:10.637: I/System.out(1330):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-07 09:03:10.637: I/System.out(1330):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-07 09:03:10.637: I/System.out(1330):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-07 09:03:10.669: I/System.out(1330):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-07 09:03:10.708: I/System.out(1330):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-07 09:03:10.747: I/System.out(1330):     at java.lang.Thread.run(Thread.java:856)
10-07 09:03:10.917: I/Choreographer(1330): Skipped 35 frames!  The application may be doing too much work on its main thread.
10-07 09:03:11.047: D/AndroidRuntime(1330): Shutting down VM
10-07 09:03:11.047: W/dalvikvm(1330): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
10-07 09:03:11.077: E/AndroidRuntime(1330): FATAL EXCEPTION: main
10-07 09:03:11.077: E/AndroidRuntime(1330): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
10-07 09:03:11.077: E/AndroidRuntime(1330):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at java.util.ArrayList.get(ArrayList.java:304)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment.generatePieDataChannels(ChannelsAndLanguageFilterFragment.java:311)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment.access$11(ChannelsAndLanguageFilterFragment.java:304)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment$GetChannelAndLanguageData.onPostExecute(ChannelsAndLanguageFilterFragment.java:270)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at m_brain.m_adaptive.m_DetailActivity.ChannelsAndLanguageFilterFragment$GetChannelAndLanguageData.onPostExecute(ChannelsAndLanguageFilterFragment.java:1)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.os.AsyncTask.finish(AsyncTask.java:631)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.os.Looper.loop(Looper.java:137)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at android.app.ActivityThread.main(ActivityThread.java:4745)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at java.lang.reflect.Method.invokeNative(Native Method)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at java.lang.reflect.Method.invoke(Method.java:511)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-07 09:03:11.077: E/AndroidRuntime(1330):     at dalvik.system.NativeStart.main(Native Method)

我在一个片段这样做的,图中这是在一个ListView中显示的数据。我是初学者在这一点,所以请指导我,如果我在一个错误的方式做这件事还是需要不同的方法。而且我不能够理解,如果这是因为HTTP请求或其他任何hapening。该生产线就显示了在尝试方法终点。

I am doing this in a Fragment and displaying Data in Graphs which are in a ListView. I am beginner in this, so please guide me if i am doing it in a wrong way or need a different approach. Moreover i am not able to understand if this is hapening because of the Http request or anything else. The line it shows point at end of the try method.

推荐答案

您可以使用这个类与此处理:

You can use this class to handle with this:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class ServiceHandler 
{

    private JSONObject response = null;

    public final static int GET = 1;

    public final static int POST = 2;

    public JSONObject makeServiceCall( String url, int method )
    {

        return this.makeServiceCall( url, method, null );

    }

    public JSONObject makeServiceCall( String url, int method, List<NameValuePair> params )
    {

        try
        {

            DefaultHttpClient httpClient = new DefaultHttpClient();

            HttpEntity httpEntity = null;

            HttpResponse httpResponse = null;

            if( method == POST )
            {

                HttpPost httpPost = new HttpPost( url );

                if( params != null )
                {

                    httpPost.setEntity( new UrlEncodedFormEntity( params, "UTF-8" ) );

                }

                httpResponse = httpClient.execute( httpPost );

            }else if( method == GET )
            {

                if( params != null )
                {

                    String paramString = URLEncodedUtils.format( params, "UTF-8" );

                    url += "?" + paramString;

                }

                HttpGet httpGet = new HttpGet( url );

                //Envia a URL e pega a resposta.
                httpResponse = httpClient.execute( httpGet );

            }

            httpClient = null;

            httpEntity = httpResponse.getEntity();

            httpResponse = null;

            String JSONString = EntityUtils.toString( httpEntity );

            Log.e( "JSON", JSONString );

            try
            {

                response = new JSONObject( JSONString );

            }catch( JSONException e ) { }

            httpEntity = null;

        }catch( UnsupportedEncodingException e ) 
        {

            e.printStackTrace();

        }catch( ClientProtocolException e ) 
        {

            e.printStackTrace();

        }catch( IOException e )
        {

            e.printStackTrace();

        }

        return response;

    }

}

使用方法:

ServiceHandler serviceHandler = new ServiceHandler();

JSONObject jsonObj = serviceHandler.makeServiceCall( URL, ServiceHandler.POST OR ServiceHandler.GET, PARAMS );

这篇关于同时使用POST和GET在AsyncTask的http请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆