Diskuze: GET a POST v android studiu s basic auth
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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
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
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.
Děkuji mockrát, snad se s tím nějak poperu, nejsem z toho dvakrát moudrý :/
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.
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
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.performRequest: Unexpected response code 400 for http://............./data/busorders , pravděpodobně mám
špatně autorizaci
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...
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.example.parsaniahardik.VolleyPost E/Volley: [3036] BasicNetwork.performRequest: Unexpected response code 400 for http://--.--.---.--:--/data/busorders
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.
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
Dobrá, bude to tedy v kódu. Jaký řádek v kódu tu vyjímku vyhodí? Dojde to vůbec do toho onErrorResponse listeneru?
Jak zjistím řádek? V logcatu to píše jen chybu ale řádek nevím
Možná se nechápeme nebo jsem úplný blbec 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
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.
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á
Program mi neposílej, nespustil bych ho, protože nemám nainstalovaný AS. Zkoušel jsi to spustit na reálném zařízení?
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.
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.
Jasný, už jsem právě nějak od znova začal, děkuji za ochotu a
omlouvám se zdržování
Zobrazeno 25 zpráv z 25.