Odpowiedz z serwera przez JSON

0

Cześć,
Szukam pomocy siedzę od kilkunastu godzin i zastanawiam się w czym jest problem mianowicie wysyłam zapytanie do serwera i za każdym razem w Javie dostaje odpowiedz

"Błąd żądania. Kod statusu: 400
Odpowiedź serwera: {"status* content type header')"

    private static final String API_URL = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // Ustawienie layoutu z klasy R

        linkEditText = findViewById(R.id.linkEditText);
        downloadButton = findViewById(R.id.download_mp3);
        responseTextView = findViewById(R.id.responseTextView);

        downloadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String inputUrl = linkEditText.getText().toString().trim();
                if (!inputUrl.isEmpty()) {
                    new DownloadTask().execute(inputUrl);
                }
            }
        });
    }

    private class DownloadTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            String inputUrl = urls[0];
            OkHttpClient client = new OkHttpClient();
            JSONObject requestData = new JSONObject();
            try {
                requestData.put("url", inputUrl);
                requestData.put("vCodec", "h264");
                requestData.put("vQuality", "720");
                requestData.put("aFormat", "mp3");
                requestData.put("isAudioOnly", true);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
            RequestBody requestBody = RequestBody.create(mediaType, requestData.toString());

            Request request = new Request.Builder()
                    .url(API_URL)
                    .post(requestBody)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json")
                    .build();

            try {
                Response response = client.newCall(request).execute();
                String responseData = response.body().string();
                if (response.isSuccessful()) {
                    JSONObject jsonResponse = new JSONObject(responseData);
                    String downloadLink = jsonResponse.getString("downloadLink");
                    return "Odpowiedź od serwera: " + downloadLink;
                } else {
                    return "Błąd żądania. Kod statusu: " + response.code() + "\nOdpowiedź serwera: " + responseData;
                }
            } catch (IOException | JSONException e) {
                e.printStackTrace();
                return "Błąd żądania: " + e.getMessage();
            }
        }

Natomiast gdy zrobię to samo przez pythona dostaje odpowiedz z api (kod 200 czyli success)

import requests
import json

api_url = ""

request_data = {
    "url": "",
    "vCodec": "h264",
    "vQuality": "720",
    "aFormat": "mp3",
    "isAudioOnly": True
}

headers = {
    "Accept": "application/json"  # Dodaj ten nagłówek do żądania
}

response = requests.post(api_url, json=request_data, headers=headers)

if response.status_code == 200:
    response_data = response.json()
    print("Odpowiedź od API:")
    print(json.dumps(response_data, indent=2))
else:
    print("Błąd żądania. Kod statusu:", response.status_code)
    if response.status_code == 400:
        error_data = response.json()
        print("Błąd żądania:")
        print(json.dumps(error_data, indent=2))

Może ktoś mi wyjaśnić o co tutaj chodzi? jak rozwiązać ten problem w javie?

2

Zainstaluj sobie Fiddler i sprawdź różnicę

4

Pomysł z fiddlerem (wyżej) bardzo dobry.

Widzę, że w javie dodajesz nagłowek Content-Type, w Pythonie być może nie (być może, bo "nigdy nie wiadomo" co sobie same biblioteki dodają).
Odpowiedź serwera (BadRequest i to content type header) sugeruje, że może to mieć coś z tym wspólnego.

Ale prawda jest taka, że tak naprawdę nie wiadomo, kto pisał ten serwer i w czym - więć może to być zmyła.

0

To APK

Zapytanie 
AppEcation Headers
accept: application/json
accept-encoding: gzip
connection: Keep-Alive
content-length: 109
content-type: application/json; charset= utf-8
host: co.wuk.sh
user-agent: okhttp/4.g.1
Body (JSON)
"url”: "”,
"vCodec":
”h2ó4 ” ,
"vQuality": "720
"aFormat”: "mp3
”isAudi00nly " :
true
View Source

Odpowiedz

Headers
access-control-allow-origin:
alt-svc: ma=86400
cf-cache-status: DYNAMIC
cf-ray: 7f4010a32bc9cca3- WAW
content-length: 55
content-type: application/json; charset=utf-8
date Wed, GMT
etag: W/"37-H8GZUDCn3i0905cmucDBoprrTc0"
net: {"success_fraction":0, "report_to":” cf-nel",”
report-to: {"endpoints":[{"url":"https:VVa.nel.cloudflare.comVreportVv3?s=wHEWrW6rYqUFJdCpvtje53eW8vL2PT46r511FeRZdZ6c
group": " Cf- nel",
response-status-code: 400
server: cloudflare
Body (JSON)
View Source

To PY

Nagłówki zapytania:
User-Agent: python-requests/2.31.0
Accept-Encoding: gzip, deflate, br
Accept: application/json
Connection: keep-alive
Content-Length: 115
Content-Type: application/json

Odpowiedź od serwera:
{
  "status": "stream",
  "url": "https://nl2-co.wuk.sh/api/stream?..."
}

Nagłówki odpowiedzi:
Date: Wed, 09 Aug 2023 12:43:17 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
ETag: W/"a7-H0u9tsYZ5dOE9Zl+mPcOTlhp7jw"
CF-Cache-Status: DYNAMIC
Report-To: {"endpoints":**[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=6hL23n%2BCSjYZKsMS0bbSfR02E5CO5Bhbc1apIgjimao%2BpLl7AQgRnKSqYCF%2BngDuF4mLCRWSKNNE0%2BUTSLJ16CJ23zgwal1D7q%2BattQ%2BKb%2FgqzRmK7XC9rbTaUI%3D"}]**,"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 7f4015765f8d35b8-WAW
Content-Encoding: br
alt-svc: h3=":443"; ma=86400

Ktoś wie o co tutaj chodzi? według mnie to to samo...

0

ale ze tak Ci formatuje json czy co to niby jest?

"url”: "”,
"vCodec":
”h2ó4 ” ,
"vQuality": "720
"aFormat”: "mp3
”isAudi00nly " :
0

Ty to przepisywałeś czy co się dzieje? Zakładam że użyłeś czytnika ekranu z powertoolsów
Kliknij "View source" i skopiuj tekst jak człowiek a nie używasz OCR do skopiowania tekstu z ekranu.

Teraz to nie wiadomo bo jest tyle błędów że głowa mała, np spacja w "charset= utf-8". Poza tym wychodzi że kod w pythonie w ogóle nie wysłał body.
Doprowadź te zapytania po prostu do takiego samego wyglądu i tyle, nie musisz tu nic wklejać

0
obscurity napisał(a):

Kliknij "View source" i skopiuj tekst jak człowiek a nie używasz OCR do skopiowania tekstu z ekranu.

Kod z OCR, tego (chyba) jeszcze tu nie było. Były printscreeny, były krzywe zdjęcia z komórki. Powinna być nagroda *)

1 użytkowników online, w tym zalogowanych: 0, gości: 1