0

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

我在stackoverflow上发现了一个问题 https://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-service 方法,因为我在这里遇到了一些问题。在某些网站上,我读到 Apache web-server 应该用于获取 HTTP 客户端。但是,我不确定,也不知道为什么?

我的问题是:

1)他们是否需要安装任何东西来获得网络服务器,或者我们的编码足以调用网络服务而无需事先安装任何东西?

2) 在 PNRWebService() 方法中,我需要做什么才能获得连接并使用 URL 调用服务?我知道我需要通过 HTTPClient 建立连接,但是在浏览了许多示例和视频之后,我不知道他们实际上是如何做到的?

3) http://pnrapi.alagu.net/参考本网站我正在尝试获取 PNR 状态?将其称为我需要做的事情,因为我不知道其中的 URL 是什么,以及在获取 URL 后我还应该做什么?

4) 我从 Apache 导入了一些包,不知道值不值?

如果有人有很好的知识,请帮助大家,然后请让我知道如何执行。

4

2 回答 2

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 中完成)

希望这可以帮助

于 2013-07-08T09:05:42.117 回答
0

首先,您需要知道您尝试访问的 Web 服务是Restful Webservice。

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

第三,您需要运行后台进程或使用AsyncTask在后台线程上执行网络事务。您无法在 Honeycombe 或更高版本的 UI 线程上执行网络 IO

有几个教程可用..只需谷歌它..

检查此链接: Android、Web 服务、AsyncTask 请帮助一个菜鸟/确保我开始正确

如果您仍然有疑问,请发布它..

于 2013-07-08T09:15:56.310 回答