OkHttp Json Post mit Php Server

  • Antworten:12
sarith randir
  • Forum-Beiträge: 8

22.04.2018, 20:32:05 via Website

Hallo bin ganz neu in der Android Entwicklung. Es macht mir bis jetzt viel spaß habe eine App geschrieben die mich Infos abfragen kann zum lernen. Bis jetzt habe ich nur Daten von dem Server geholt mittels okhttp request nun will ich Daten auf meine mysql Datenbank senden. WEiß nur nicht wie ich einen Post im json Format erstelle. und eine andere frage die immer wieder aufkam ist die nach dem nutzen und Funktion eines "Headers". Wäre sehr dankbar wenn mcih jemand unterstüzen könnte.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

22.04.2018, 20:36:37 via App

Hallo sarith,
Herzlich willkommen hier im Forum :)

Du kannst die Daten als Json packen (stichwort Serialisierung) bzw. json selbst erstellen.

Dann per OkHttp als Post Body verschicken:

https://stackoverflow.com/a/34180100

Der HTTP Header enthält Meta Infos z.b. mit deiner bevorzugten Sprache, Browser UserAgent, format des Requests/Response (html oder json etc..).
Zudem kann im Header noch Cookie Values und andere wichtige Infos zur Verfügung gestellt werden.

— geändert am 22.04.2018, 20:38:22

LG Pascal //It's not a bug, it's a feature. :) ;)

sarith randir

Antworten
sarith randir
  • Forum-Beiträge: 8

23.04.2018, 18:56:52 via Website

Danke für deine Antwort habe nun versucht einen Code mit dem Input den du mir gegeben hast zu schreiben. Komme aber nicht weiter bei der runOnUiThread Methode. Ist bei mir fehler haft weist du wieso? Und der Toast findet auch keine activity.

Hier ist mein Code:

    package com.example.test.heilpraktikerapp;
import android.os.Looper;
import android.widget.Toast;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.*;
import okhttp3.RequestBody;

public class Sent {

    private String frage;
    private String antwort;
    private String mBaseUrl;
    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");


    public JSONObject toJSONObj() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Frage", this.frage);

        obj.put("antwort", this.antwort);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return obj;
    }


    public Sent(){

    String url = mBaseUrl; //+ "/" + id + "/report";
    JSONObject json= toJSONObj();
    String jsonString = json.toString();
    RequestBody body = RequestBody.create(JSON, jsonString);

    Request request = new Request.Builder()
            .header("X-Client-Type", "Android")
            .url(url)
            .post(body)
            .build();


    OkHttpClient client = new OkHttpClient();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException throwable) {

            throwable.printStackTrace();

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {

            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                 runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                    new Toast(, "hallo" , Toast.LENGTH_SHORT).show();
                    }
            });

        }});




    private void runOnUiThread(Runnable task) {
        new Handler(Looper.getMainLooper()).post(task);
    }

}}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2018, 21:31:46 via App

Beim Toast solltest du Toast.makeText als static Method benutzen.
Da brauchst du einen Activity Context für (wo es angezeigt werden soll)
Hast du sonstige Exceptions im LogCat?

— geändert am 23.04.2018, 21:31:59

LG Pascal //It's not a bug, it's a feature. :) ;)

sarith randir

Antworten
sarith randir
  • Forum-Beiträge: 8

23.04.2018, 22:26:15 via Website

ja wie gesagt er erkennt die runOnUiThread Methode nicht. AS sagt mir das ich die noch erstllen muss aber ist doch ne vogefertigte Methode in der libeery oder?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2018, 22:27:14 via App

Ja aber für da brauchst du auch einen Context, denn es heisst Context#runInUiThread()

LG Pascal //It's not a bug, it's a feature. :) ;)

sarith randir

Antworten
sarith randir
  • Forum-Beiträge: 8

23.04.2018, 22:34:46 via Website

image

hier nochmal ein bild dazu

Antworten
sarith randir
  • Forum-Beiträge: 8

24.04.2018, 10:03:59 via Website

komm nicht weiter weis nicht wieso ich keinen uiThread starten kann

Antworten
swa00
  • Forum-Beiträge: 3.704

24.04.2018, 11:01:18 via Website

Hallo sarith,

Pascal hat dir drüber schon die passende Antwort gegeben - Du benötigst deinen Context.
Genauer kann man es nicht schreiben und auch nichts hinzufügen .

Tipp : Schau dir mal erst ein wenig die Basics der Programmierung an , bevor du an
komplexere Dinge gehst .

— geändert am 24.04.2018, 11:06:42

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Antworten
sarith randir
  • Forum-Beiträge: 8

24.04.2018, 11:32:07 via Website

Danke Swa für deine Antwort, versuch mich nochmal reinzulesen über den context, dann noch was anderes wenn ich nun den post aufgreifen will auf meinem Server mittel $_post wie ist den der Name des json. wird er in dieser Zeiler declariert?

String jsonString = json.toString();

und der post befehl im php würde dann so aussehen?:

$jsonstring= $_POST["jsonString "];

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.04.2018, 13:05:44 via App

Du solltest dich auch über Http Post/Get Requests und deren Parameter informieren.

Du sendest einen JsonBody d.h. du musst den auch auslesen:

https://davidwalsh.name/php-json

LG Pascal //It's not a bug, it's a feature. :) ;)

sarith randirswa00

Antworten
sarith randir
  • Forum-Beiträge: 8

24.04.2018, 18:14:51 via Website

weis gerade nicht wo der fehler liegt woltle mal testen ob die Daten in der Datenbank angelegt werden.

das ist der Code Nr1 in der mainactivity:

 Sent sent=new Sent("dies ist eine test frage","dies ist eine test antwort");

dan die Sent klasse:

package com.example.test.heilpraktikerapp;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
 public class Sent {

    private String frage;
    private String antwort;
    private String mBaseUrl="XXXXXXXXXXXXX(kanns irgendie hier nicht posten wegen spam).cXm/hp_app/add.php";
    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");


    public JSONObject toJSONObj() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("frage", this.frage);

        obj.put("antwort", this.antwort);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return obj;
    }


    public  Sent(String frage, String antwort){

        JSONObject obj = new JSONObject();
        try {
            obj.put("frage", frage);

            obj.put("antwort", antwort);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    String url = mBaseUrl; //+ "/" + id + "/report";
    JSONObject json= obj;
    String jsonString = json.toString();
    RequestBody body = RequestBody.create(JSON, jsonString);

    Request request = new Request.Builder()
            .header("X-Client-Type", "Android")
            .url(url)
            .post(body)
            .build();


    OkHttpClient client = new OkHttpClient();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException throwable) {

            throwable.printStackTrace();

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {

            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);











}});}}

und noch der php Code ohne Passwort ;-):

<?php
    $con = mysqli_connect("localhost", "id3959215_heilpraktiker", "XXX", "id3959215_hp_app");

# Get JSON as a string
$json_str = file_get_contents('php://input');

# Get as an object
$json_obj = json_decode($json_str);

$frage=$json_obj->{'frage'};
$antwort=$json_obj->{'antwort'};



    $statement = mysqli_prepare($con, "INSERT INTO test (frage, antwort) VALUES (?, ?)");
    mysqli_stmt_bind_param($statement, "ss", $frage, $antwort);
    mysqli_stmt_execute($statement);

    $response = array();
    $response["success"] = true;  

    echo json_encode($response);
?>

Antworten
sarith randir
  • Forum-Beiträge: 8

24.04.2018, 23:17:40 via Website

Habe den Fehler gefunden, man sollte auch seiner PHP Dateien auf dem Server die richtige Endung geben und zwar *.php XD
Nun funktioniert alles eimandfrei

Antworten