我有一个应用程序来调用Web服务来获取PNR状态。但我是创建网络服务的新手所以我已经通过一些视频和示例来了解如何创建和使用网络服务。
我在 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){
}
}
我还没有创建网络服务方法,因为我在这里遇到了一些问题。在某些网站上,我读到Apache Web服务器应该用于获取HTTP客户端。但是,我不确定,也不知道为什么会这样?
我的问题是:
1)是否需要安装任何东西来获取网络服务器,或者我们的编码足以在没有事先安装任何东西的情况下调用网络服务?
2)在PNRWebService()方法中,我需要做什么才能获得连接并使用URL调用服务?我知道我需要通过HTTPClient建立连接,但经过很多例子和视频后我才知道他们实际上是怎么做到的?
3)http://pnrapi.alagu.net/参考本网站我试图获得PNR状态?要称之为我需要做的事情,因为我不知道这里的URL是什么以及在获取URL后我还应该做些什么呢?
4)我从Apache导入了一些软件包,我不知道它的价值与否?
如果有人知道,请帮助大家,请让我知道如何进行表演。
答案 0 :(得分: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完成)
希望这有帮助
答案 1 :(得分:0)
首先,您需要知道您尝试访问的网络服务是 Restful Webservice。
第二件事,webservice的响应是 json 格式。(你可以在这里使用gson库来解析数据)
第三,您需要运行后台进程或使用 AsyncTask 在后台线程上执行网络事务。您无法在Honeycombe或更高版本的UI线程上执行网络IO
有几个教程可用..只是google it ..
检查此链接: Android, Web Services, AsyncTask please help a noob/make sure im starting right
如果你仍然怀疑发布它..