2013-07-08 172 views
0

我有一个应用程序调用Web服务来获取PNR状态。但我是创建网络服务的新手,所以我已经通过一些视频和示例来了解如何创建和使用Web服务。创建Web服务时遇到问题

我在stackoverflowhttps://stackoverflow.com/questions/14598485/need-indian-railway-apis-for-making-app-for-pnr-status-train-info-etc和这个问题中提供的所有链接,我得到这个:http://pnrapi.alagu.net/

我的代码是:

XML:activity_status_pnr.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText android:id="@+id/et_pnr" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/h" 
     android:maxLength="10" /> 

    <Button android:id="@+id/pnr_status" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/gstatus" 
     android:layout_gravity="center" /> 


</LinearLayout> 

Java代码:StatusPNR.java

package com.example.infopnr; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 

import java.io.IOException; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class StatusPNR extends Activity { 

    String URL = "http://pnrapi.alagu.net/api/v1.0/pnr/UR_PNR_CODE"; 
    String result = ""; 
    //String deviceId = "xxxxx" ; 
    //final String tag = "Your Logcat tag: "; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_status_pnr); 

     final EditText txtSearch = (EditText)findViewById(R.id.et_pnr); 
     txtSearch.setOnClickListener(new EditText.OnClickListener() 
     { 
      public void onClick(View v){txtSearch.setText("");} 
     }); 

     final Button btnSearch = (Button)findViewById(R.id.pnr_status); 
     btnSearch.setOnClickListener(new Button.OnClickListener(){ 
      public void onClick(View v) { 
       String query = txtSearch.getText().toString(); 
       PNRWebService(query); 

      } 
     }); 

     } 

    private void PNRWebService(String q){ 


    } 
} 

我还没有创建的Web服务方法尚未作为我在这里遇到了一些问题。在某些网站上,我读到应该使用Apache Web服务器来获取HTTP客户端。但是,我不确定,不知道为什么会这样?

我的问题是:

1)是他们的任何需要安装以获得web服务器或我们的编码是足以调用Web服务没有任何东西任何事先安装?

2)在PNRWebService()方法中,我需要做什么才能获得连接并使用URL调用服务?我知道我需要通过HTTPClient建立连接,但经过许多例子和视频之后,我并没有明白他们究竟是怎么做的?

3)http://pnrapi.alagu.net/与本网站的参考我想获得PNR状态?为了调用这个我需要做的事情,因为我不知道这个URL是什么,以及在获取URL之后还应该做些什么?

4)我从Apache导入了一些软件包,我不知道它是否值得?

如果任何人有良好的知识,请帮助他人,然后请让我知道如何执行。

回答

1

好的。首先,我建议你使用AsyncTask。你可以谷歌它,并找出它是如何完成的。

下面是一个示例代码

//Main Class 
public class MainActivity extends Activity { 

String url = "http://pnrapi.alagu.net/api/v1.0/pnr/UR_PNR_CODE"; 



//Your call to asynctask 
new asyncTask(this).execute(url); 

} 

//asyncTask class 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 

import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.Toast; 

public class asyncTask extends AsyncTask<String, Void, String> { 
HttpResponse response = null; 
    HttpClient httpClient = new DefaultHttpClient(); 
    private Context context; 
    private ProgressDialog dialog; 
    int code; 
String codeValue = ""; 

    public asyncTask(Context cxt) { 
     context = cxt; 

     dialog = new ProgressDialog(context); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 

     Log.d("in ASyn Task", arg0[0]); 

     HttpGet httpget = new HttpGet(arg0[0]);//This get your URL 
     Log.d("after url in httpget", "after url"); 


     try { 
      response = httpClient.execute(httpget); 
      StatusLine line = response.getStatusLine(); 
      code = line.getStatusCode(); 
      codeValue = String.valueOf(code); 
      Log.d("code", codeValue); 
      Log.d("Response", "Connected"); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      Log.d("Response 2", "not Connected in exception"); 
      e.printStackTrace(); 
     } catch (IOException e) { // TODO Auto-generatedcatch block 
      Log.d("Response 3", e.toString()); 
     } 



     return "Connected !!"; 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 

     dialog.setTitle("Please Wait..."); 
     dialog.show(); 

     // Toast.makeText(asyncTask.this,"Please wait.. !! Uploading data to server",Toast.LENGTH_LONG).show(); 

    } 
    @Override 
    protected void onPostExecute(String result) { 
     dialog.dismiss(); 

    AlertDialog.Builder alert = new AlertDialog.Builder(context); 
    alert.setTitle("Alert"); 
    if (code == 200) { 
     alert.setMessage("Connection to host established !! ") 
       .setCancelable(false) 
       .setPositiveButton("Ok", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           dialog.cancel(); 
          } 

         }); 

    } 

    else { 
     alert.setMessage("Error Connecting to server. Try Again") 
       .setCancelable(false) 
       .setPositiveButton("Ok", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           dialog.cancel(); 
          } 

         }); 
    } 

    AlertDialog alertDialog = alert.create(); 
    alertDialog.show(); 
} 

} 

检查你的代码是200 ..如果是你能够建立与Web服务的连接。(在onPostExecute做在上面的代码)

希望这有助于

+0

谢谢帕尔!我已经实现了它,但我想问一下,我想调用ansynTask单击按钮,当我创建它像这样:final Button btnSearch =(Button)findViewById(R.id.pnr_status); btnSearch.setOnClickListener(新Button.OnClickListener(){ 公共无效的onClick(视图v){ \t \t新的AsyncTask(本).execute(URL); } }); – Saggy

+0

它显示错误:构造函数StatusPNR.asyncTask(新View.OnClickListener(){})未定义....在这里我不能调用on-clickListener事件的构造函数作为上下文值在那里。对? – Saggy

+0

我想不可以在OnClick Event上调用asyncTask,如果没有,那么程序将如何知道从他们需要获取PNR的位置以及点击他们需要启动过程的位置?我有点混乱。 – Saggy

0

第一件事情,你需要知道的是你要访问的Web服务是宁静 web服务。

第二件事,webservice的响应是json格式。(ü可以在这里使用GSON库来解析数据)

第三,你需要运行一个后台进程或使用的AsyncTask对背景thread.You不能在UI线程上执行网络IO进行网络交易在Honeycombe或更高版本

几个教程可以..它只是谷歌..

检查此链接: Android, Web Services, AsyncTask please help a noob/make sure im starting right

如果你仍然有疑问张贴..