De ce încercarea de a posta un nod din Android are ca rezultat „HTTP/1.1 415 Unsupported Media Type”? [închis] (Drupal, 8)

Mde a intrebat.

Am folosit următorul cod pentru a posta niște date pe site-ul meu. Am testat site-ul cu Postman folosind aceleași date și funcționează corect, dar când rulează următorul cod pe Android Studio, response.getStatusLine() returnează HTTP/1.1 415 415 Unsupported Media Type.

       HttpClient httpClient = new DefaultHttpClient();
       HttpPost httpPost = new HttpPost("http://www.example.com/entity/node");
       HttpResponse response = null;
       String responseBody = "";


       try{
           JSONObject json = new JSONObject();
           JSONObject c0 = new JSONObject();
           JSONObject c00 = new JSONObject();
           JSONObject c1 = new JSONObject();
           JSONObject c2 = new JSONObject();


           json.put("_links",c0);
           json.put("title",c1);
           json.put("type",c2);

           c0.put("type",c00);
           c00.put("href","http://www.example.com/rest/type/node/article");
           c1.put("value", "test string");
           c2.put("target_id", "article");


           String base64EncodedCredentials = "Basic " + Base64.encodeToString(
                   ("user"+ ":" + "pass").getBytes(),
                   Base64.NO_WRAP);


           StringEntity se = new StringEntity(json.toString());



           se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

           httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
           httpPost.setHeader("Authorization", base64EncodedCredentials);

           httpPost.setEntity(se);

           // Execute HTTP Post Request
           response = httpClient.execute(httpPost);

           String jsonResponse = EntityUtils.toString(response.getEntity());
           JSONObject jsonObj = new JSONObject(jsonResponse);

           if (response.getStatusLine().getStatusCode() == 200) {
               Log.v("response ok", "ok response :/");
           } else {
               Log.v("response not ok", "Something went wrong :/");
           }
       catch (Exception e){
           Log.v("Error posting:",e.getMessage());
       }

Am testat fiecare dintre aceste linii separat și împreună, dar niciuna dintre ele nu funcționează.

    se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));

           httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");

De ce se returnează HTTP/1.1 415 Unsupported Media Type (Tip media nesuportat)?

Comentarii

  • Poate că trebuie să setați un X-CSRF-Token? –  > Por undersound.
  • Poate ați uitat să adăugați tipul de cerere pe care îl trimiteți ca parametru de interogare? De exemplu http://www.example.com/entity/node?_format=hal_json –  > Por Canutza.
2 răspunsuri
Kamal Oberoi

M-am confruntat cu aceeași problemă cu aceeași situație pe care ați descris-o mai sus. După ce am petrecut 2-3 ore am obținut date prin:

$formdata = file_get_contents('php://input');

A funcționat pentru mine.

TechNikh

Mde, În loc să folosiți HttpClient încercați să folosiți OkHttpClient ca această aplicație Drupal 8 Android la https://github.com/onedrupal/One-Drupal-Android.

request = new Request.Builder()
                        .header("Content-Type", "application/json")
                        .url(url)
                        .patch(api_body)
                        .build();
OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .addInterceptor(new AddCookiesInterceptor())
                .build();

Adăugați AddCookiesInterceptor la https://github.com/onedrupal/One-Drupal-Android/blob/master/app/src/main/java/com/technikh/onedrupal/network/AddCookiesInterceptor.java

public class AddCookiesInterceptor implements Interceptor {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
.......
Preferences.getDefaultPreferences().getStringSet(Preferences.PREF_COOKIES, new HashSet<>());
        for (String cookie : preferences) {
            builder.addHeader("Cookie", cookie);
        }
......
        builder.addHeader("X-CSRF-Token", mAuthPreferences.getAuthToken());

        return chain.proceed(builder.build());
    }
}

Tags: