IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Vojtěch Pavlik:25.11.2019 12:12

Ahoj,
vzhledem k tomu, že jsem v tomto ohledu celkem začátečník potřeboval bych od vás menší výpomoc.. Mohl by mi někdo z vás poradit jak by vypadal zápis GET a POST
(ve tvaru {
"code": "Test",
"name": "Testovací zakázka"}) s basic auth?

Zkusil jsem: Hledal jsem různé návody na netu , ale nikde to není tak dobře popsané abych to pochopil... Už jsem to dělal ve VBs a tam mi to jde, ale tady vůbec nevím.

Chci docílit: Vytvářím aplikaci pro výpis položek ze skladu a zároveň i zápis položek na sklad.

 
Odpovědět
25.11.2019 12:12
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:25.11.2019 12:41

Ahoj,
Basic auth se vkládá do hlavičky požadavku ve formátu:

Basic username:password

Název hlavičky je: Authorization

Dále je potřeba to jméno a heslo zakódovat pomocí base64, aby z toho vznikl jeden řetězec.

Více můžeš najít třeba na Wiki

Nahoru Odpovědět
25.11.2019 12:41
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Pavlik:25.11.2019 12:56

Mohl by jste zapsat příklad kódu? Úplně nevím jestli teď rozumím. Token na authorizaci mám jen nevím kam s ním do kódu v androidu. Ve VB jsem to měl takto ale tady nevím

Set http = CreateObject("Msxml2.XMLHTTP.6.0")
Dim token
token = "QVBJOjEyMzQ1"
http.Open "GET", "http://IP/data/busorders", false
http.SetRequestHeader "Content-Type", "application/json"
http.SetRequestHeader "Accept", "application/json"
http.setRequestHeader "Authorization", "Basic "& token
http.send
rem RTag.SetTagValue "System", "promena", http.ResponseText
msgbox http.ResponseText
Set http = Nothing
Editováno 25.11.2019 12:57
 
Nahoru Odpovědět
25.11.2019 12:56
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:25.11.2019 15:54

https://androidclarified.com/…lley-example

Scrolluj za půlku stránky a najdeš tam příklad s vložením vlastních hlaviček do GET requestu.

Nahoru Odpovědět
25.11.2019 15:54
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Pavlik:27.11.2019 6:47

Děkuji mockrát, snad se s tím nějak poperu, nejsem z toho dvakrát moudrý :/

 
Nahoru Odpovědět
27.11.2019 6:47
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:27.11.2019 8:45

Z čeho přesně nejsi dvakrát moudrý? :-?
Co jsem tak koukal, tak v tom článku je vše vysvětleno. Knihovnu přidáš do závislosti a pak ji můžeš začít používat. Kousek za půlkou článku je kód, kde je příklad na použití vlastních hlaviček:

//URL of the request we are sending
String url = "api.openweathermap.org/data/2.5/weather?q=London";

// Tímto vytvoříš nový požadavek
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
    url, null,
    new Response.Listener() {
        // Toto se zavolá při úspěšném vykonání požadavku => server něco odpověděl
        @Override
        public void onResponse(JSONObject response) {
            //Success Callback
        }
    },
    new Response.ErrorListener() {
        // Toto se zavolá při neúspěšném vykonání požadavku
        @Override
        public void onErrorResponse(VolleyError error) {
            //Failure Callback
        }
    })
{
    // Tady přepíšeš metodu na vytvoření vlastních hlaviček
    @Override
    public Map getHeaders() throws AuthFailureError {
        HashMap headers = new HashMap();
        headers.put("Content-Type", "application/json");
        // Tady vložíš tu tvoji autorizační hlavičku
        headers.put("Authorization", "Basic " + token);
        return headers;
    }
};
// Nakonec to všechno dáš dohromady a odešleš požadavek
MyApplication.getInstance().addToRequestQueue(jsonObjectReq, "headerRequest");

V Androidu už nějaký pátek neprogramuji, tak nevím, jak je dnes moderní dělat HTTP requesty, ale tento návod mi vyskočil jako první odkaz na google. Pokud budeš mít i přes to všechno problémy s implementací, hoď sem kód, který ti nefunguje a něco už vymyslíme. ;-)

Nahoru Odpovědět
27.11.2019 8:45
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Petr Štechmüller
Lubor Pešek:27.11.2019 11:32

:) To je přístup. Máš můj respekt.

Nahoru Odpovědět
27.11.2019 11:32
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Vojtěch Pavlik:27.11.2019 14:07

Mockrát děkuji, už mi to běží :) teď ještě jdu najít nějaký překladač který mi JSON přehodí do normálního tvaru ve kterém se vyzná normální člověk :)

 
Nahoru Odpovědět
27.11.2019 14:07
Avatar
Vojtěch Pavlik:3.12.2019 8:05

Zdravím tak jestli můžu, tak mám problém s tímto kódem.:

public class MainActivity extends AppCompatActivity {

    private String url = "http://............/data/busorders";
    private String token = "QVBJOjEyMzQ1";
       private RequestQueue requestQueue;
    private EditText et_code, et_name;
    private Button btn_submit;
    private StringRequest stringRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_code = (EditText)findViewById(R.id.et_code);
        et_name = (EditText)findViewById(R.id.et_name);


        btn_submit = (Button) findViewById(R.id.btn_submit);

        btn_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data = "{"+
                        "\"code\"" + "\"" + et_code.getText().toString() + "\","+
                        "\"name\"" + "\"" + et_name.getText().toString() + "\""+
                        "}";
                Submit(data);
            }
        });
    }

    private void Submit(String data)
    {
        final String savedata= data;


        requestQueue = Volley.newRequestQueue(getApplicationContext());
        stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject objres=new JSONObject(response);
                    Toast.makeText(getApplicationContext(),objres.toString(),Toast.LENGTH_LONG).show();


                } catch (JSONException e) {
                    Toast.makeText(getApplicationContext(),"Server Error",Toast.LENGTH_LONG).show();

                }
                //Log.i("VOLLEY", response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();

                //Log.v("VOLLEY", error.toString());
            }
        }) {
            @Override
            public Map getHeaders() throws AuthFailureError {
                HashMap headers = new HashMap();
                headers.put("Content-Type", "application/json");
                headers.put("Authorization", "Basic " + token);
                return headers;
            }

            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return savedata == null ? null : savedata.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    //Log.v("Unsupported Encoding while trying to get the bytes", data);
                    return null;
                }
            }

        };
        requestQueue.add(stringRequest);
    }


}

Vyhodí mu to bohužel tuto chybu: E/Volley: [2935] BasicNetwork.per­formRequest: Unexpected response code 400 for http://............./data/busorders , pravděpodobně mám špatně autorizaci :-S

 
Nahoru Odpovědět
3.12.2019 8:05
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 8:59

Ahoj, základem úspěchu bude zjistit, kde je chyba. Když tuto chybu vyGooglíš, tak zjistíš, že na StackOverflow je těchto dotazů spousta. Hned první odkaz je použitelný.

Vlož toto do onErrorResponse metody:

// As of f605da3 the following should work
    NetworkResponse response = error.networkResponse;
    if (error instanceof ServerError && response != null) {
        try {
            String res = new String(response.data,
                       HttpHeaderParser.parseCharset(response.headers, "utf-8"));
            // Now you can use any deserializer to make sense of data
            JSONObject obj = new JSONObject(res);
        } catch (UnsupportedEncodingException e1) {
            // Couldn't properly decode data to string
            e1.printStackTrace();
        } catch (JSONException e2) {
            // returned data is not JSONObject?
            e2.printStackTrace();
        }
    }

https://stackoverflow.com/a/35426721

Až to budeš mít, tak by jsi měl být schopný na základě odpovědi ze serveru zjistit, co je špatně. Pokud ani tak neuspěješ, pošli tu odpověď sem...

Nahoru Odpovědět
3.12.2019 8:59
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Pavlik:3.12.2019 9:21

Jj na tento návod už jsem koukal, vložil jsem kód ale stále stejná odpověď 2019-11-13 08:14:11.811 22678-22722/com.exam­ple.parsaniahar­dik.VolleyPost E/Volley: [3036] BasicNetwork.per­formRequest: Unexpected response code 400 for http://--.--.---.--:--/data/busorders

 
Nahoru Odpovědět
3.12.2019 9:21
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 9:43

Dobrá, tak zkus vytvořit stejný HTTP požadavek v programu typu Postman, aby jsi ověřil, že ta autorizace funguje.
Očividně to tožit nebude chyba v kódu, ale v datech.

Nahoru Odpovědět
3.12.2019 9:43
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Pavlik:3.12.2019 9:48

Všechno v pořádku, já si fakt myslím že mám něco blbě napsané přece jen se v tom učím

 
Nahoru Odpovědět
3.12.2019 9:48
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 9:58

Dobrá, bude to tedy v kódu. Jaký řádek v kódu tu vyjímku vyhodí? Dojde to vůbec do toho onErrorResponse listeneru?

Nahoru Odpovědět
3.12.2019 9:58
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Pavlik:3.12.2019 10:05

Jak zjistím řádek? V logcatu to píše jen chybu ale řádek nevím

 
Nahoru Odpovědět
3.12.2019 10:05
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 10:16

Tak si to odkrokuj...

Nahoru Odpovědět
3.12.2019 10:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Pavlik:3.12.2019 10:24

Možná se nechápeme nebo jsem úplný blbec :D Program mám nahraný v simulátoru, všechno v pořádku, Kliknu na tlačítko odeslat požadavek v mém případě btn_submit a teprve potom mi log vyhodí tu chybu

 
Nahoru Odpovědět
3.12.2019 10:24
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 10:51

Jestli to spouštíš v simulátoru, tak se ujisti, že má přístup k internetu.
Pokud můžeš, spusť to na reálném zařízení.

Tak si to odkrokuj...

Tím jsem myslel, že spustíš aplikaci v debug modu, hodíš do kódu breakpointy a podíváš se, co se tam doopravdy děje.

Nahoru Odpovědět
3.12.2019 10:51
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Pavlik:3.12.2019 11:29

tady bude zakopaný pes

 
Nahoru Odpovědět
3.12.2019 11:29
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Pavlik:3.12.2019 11:42

No nebo spise v té hlavičce

 
Nahoru Odpovědět
3.12.2019 11:42
Avatar
Vojtěch Pavlik:3.12.2019 12:30

Já se omlouvám, ale opravdu nevím kde by mohl být problém, projel jsem to debugem a všechno se jeví v pohodě. Mohu vám klidně poslat někam program třeba uvidíte více než já 8-|

 
Nahoru Odpovědět
3.12.2019 12:30
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 12:35

Program mi neposílej, nespustil bych ho, protože nemám nainstalovaný AS. Zkoušel jsi to spustit na reálném zařízení?

Nahoru Odpovědět
3.12.2019 12:35
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Pavlik:3.12.2019 12:38

Ještě né, ale mám jiný program na ten samý server akorát GET požadavek a to mi normálně na simulátoru funguje.

 
Nahoru Odpovědět
3.12.2019 12:38
Avatar
Odpovídá na Vojtěch Pavlik
Petr Štechmüller:3.12.2019 12:41

No dobrá, tak asi začni pěkně od začátku.

Nejdřív bych asi ověřil, že ta knihovna funguje tak, jak má. Zkusil bych tedy nejdřív udělat nějaký GET požadavek bez žádné autorizace na nějakou stránku s daty.

Když tohle bude fungovat, tak bych šel dál a přešel bych na POST požadavek. Nakonec bych nasimuloval odeslání Autorizační hlavičky.
Během zkoumání se někde ta chyba bude muset projevit.

Nahoru Odpovědět
3.12.2019 12:41
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Pavlik:3.12.2019 12:43

Jasný, už jsem právě nějak od znova začal, děkuji za ochotu a omlouvám se zdržování :)

 
Nahoru Odpovědět
3.12.2019 12:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.