Hallo,
für mein Studium (Projektarbeit/Bachelorarbeit) habe ich die Aufgabe, eine Applikation für Android zu schreiben, mit der man auf die Datenbank i-doit zugreifen kann. Dies ist mein erstes Projekt im Bezug auf Android und JSON. Das Dokument mit der technischen Erläuterung der "i-doit JSON RPC API" hilft mir leider nur bedingt weiter. Ich versuche per HTTP Post auf die demo-Datenbank zuzugreifen, jedoch weiß ich nicht, in wiefern ich die params und den api-key bzw. Nick/PW einbinden soll. Ebenfalls weiß ich nicht, ob ich die richtige URL verwende, da ich ständig als Request-Objekt einen Text mit "400 Bad Request"-Nachricht bekomme.
Folgendermaßen sieht mein Code aus:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_startscreen);
//Aufruf der execute-Methode (Ist die übergebene URL richtig?)
new DownloadTextTask().execute("http://demo.i-doit.com/src/jsonrpc.php");
}
public InputStream OpenHttpPOSTConnection(String url){
InputStream inputStream = null;
HttpClient httpClient = new DefaultHttpClient();
try{
HttpPost httpPost = new HttpPost(url);
// HTTP Post Header (Was muss alles per Header mitgegeben werden und stimmt die URL?)
httpPost.addHeader("Host","http://demo.i-doit.com/src/jsonrpc.php");
httpPost.addHeader("Content-Type", "application/json-rpc");
httpPost.addHeader("X-RPC-Auth-Username","admin");
httpPost.addHeader("X-RPC-Auth-Password","admin");
// JSON Objekt mit Schlüsselwertpaaren (Sind die SWP vollständig und korrekt?)
JSONObject json = new JSONObject();
HashMap <string, string="">map = new HashMap();
map.put("apikey","c1ia5q");
map.put("objID","4438");
map.put("catgID", "41");
json.put("method","cmdb.category");
json.put("version","2.0");
json.put("id","1");
json.put("params",map);
// JSON Objekt an HTTP Post übergeben
StringEntity params =new StringEntity(json.toString());
httpPost.setEntity(params);
HttpResponse httpResponse = httpClient.execute(httpPost);
inputStream = httpResponse.getEntity().getContent();
}catch(Exception e){
Log.d("OpenHttpPOSTConnection", e.getLocalizedMessage());
}finally {
httpClient.getConnectionManager().shutdown();
}
return inputStream;
}
private String DownloadText(String URL){
int BUFFER_SIZE = 2000;
InputStream in = null;
try{
in = OpenHttpPOSTConnection(URL);
}catch (Exception e){
Log.d("Networking", e.getLocalizedMessage());
return "";
}
InputStreamReader isr = new InputStreamReader(in);
int charRead;
String str = "";
char[] inputBuffer = new char[BUFFER_SIZE];
try{
while ((charRead = isr.read(inputBuffer))>0){
String readString = String.copyValueOf(inputBuffer, 0, charRead);
str += readString;
inputBuffer = new char[BUFFER_SIZE];
}
in.close();
}catch (IOException e){
Log.d("DownloadText", e.getLocalizedMessage());
return "";
}
return str;
}
private class DownloadTextTask extends AsyncTask<string, void,="" string="">{
protected String doInBackground(String... urls){
return DownloadText(urls[0]);
}
@Override
protected void onPostExecute(String result) {
// Ausgabe des JSON-Objekts vom Server als String im Textfeld der Android-App
EditText editText = (EditText)findViewById(R.id.editText_output);
editText.setText(result);
}
}</string,></string,>
Ich wäre sehr dankbar, wenn mir jemand zeigen könnte, wo meine Fehler liegen.