2016-08-02 2 views
1

안드로이드 애플 리케이션을 HttpURLConnection과 함께 편안한 서버에 연결하려고합니다. GET 요청은 성공적이지만 PUT 요청은 실패합니다. 모든 PUT 요청은 GET 요청으로 서버에 도착합니다.안드로이드 HttpURLConnection setRequestMethod PUT

@Override 
protected Boolean doInBackground(Method... params) { 
    Boolean result = false; 
    try { 
     URL url = new URL("http://server.com/api"); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     switch (params[0]) { 
      case PUT: 
       connection.setDoOutput(true); 
       connection.setRequestMethod("PUT"); 
       Log.d(TAG, "Method: " + connection.getRequestMethod()); // Correctly "Method: PUT" 
       OutputStreamWriter out = new OutputStreamWriter(
        connection.getOutputStream()); 
       out.write("Message"); 
       out.close(); 
       break; 
      case GET: 
       connection.setRequestMethod("GET"); 
       connection.connect(); 
       break; 
      default: 
       connection.setRequestMethod("GET"); 
       connection.connect(); 
       break; 
     } 

     if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      InputStream in = connection.getInputStream(); 

      JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8")); 

      reader.beginObject(); 
      while (reader.hasNext()) { 
       String name = reader.nextName(); 
       if (name.equals("state")) { 
        result = true; 
        if (reader.nextInt() == 1) { 
         state = true; 
         Log.d(TAG, "state: 1"); 
        } else { 
         state = false; 
         Log.d(TAG, "state: -1"); 
        } 
       } else if (name.equals("method")) { 
        method = reader.nextString(); // Server respone is "Method: GET" 
       } 
      } 
      reader.endObject(); 
      in.close(); 
     } else { 
      Log.d(TAG, "Connection failed"); 
     } 
     connection.disconnect(); 
    } catch (Exception e) { 
     Log.e("Exception", e.toString()); 
     e.printStackTrace(); 
    } 
    return result; 
} 

는 요청 방법 connection.connect(); 전에 정확하게 넣어 설정된다. 내가 뭘 놓치고 있니? 나는 데이터를 보내고 싶지 않다. PUT 요청은 카운터를 변경하므로 데이터가 필요하지 않습니다.

같은 기능은 webfrontend에 대한 JQuery와 함께 자바 스크립트로 구현

$.ajax({ 
    url: '/api', 
    method: 'PUT' 
}); 

편집을 작동합니다 : 은 아마 서버에 문제가 있습니다. 현재 내가 PHP 파일

<?php 
    echo(var_dump($_SERVER)); // ["REQUEST_METHOD"]=> string(3) "GET" 
    function get ($db) { 
     $state = $db->querySingle('SELECT state FROM states WHERE name="main"'); 
     echo('{"state": ' . $state . ', "method": "get"}'); 
    } 
    function put ($db) { 
     $state = $db->querySingle('SELECT state FROM states WHERE name="main"'); 
     $db->exec('UPDATE states SET state=' . ($state+1)%2 . ' WHERE name="main"'); 
     $state = $db->querySingle('SELECT state FROM states WHERE name="main"'); 
     echo('{"state": ' . $state . ', "method": "put"}'); 
} 

    if ($db = new SQLite3('database.sqlite')) { 
     switch($_SERVER['REQUEST_METHOD']){ 
      case 'GET': 
       get($db); 
       break; 
      case 'PUT': 
       put($db); 
       break; 
     } 
     $db->close(); 
    } else { 
    } 
?> 

를 사용하고 난 http://httpbin.org/put 내 응용 프로그램을 시도하고 일했다.

+0

응답 코드를 받기 전에 PUT의 경우 연결의 출력 스트림을 닫으십시오. NB'connect()'는 불필요합니다. – EJP

+0

내 코드가 변경되었습니다. 도움이되지 않았다 –

+0

매우 호기심. 한 가지 공간을 말하면서 뭔가를 보내 주시겠습니까? – EJP

답변

0

문제점을 발견했습니다. 그렇지 않으면 요청을 리디렉션하고 GET 요청으로 변환합니다. 나는 정확하게 문제를 이해하지 못한다. 그러나 나는 나를위한 해결책을 발견했다.

나는

URL url = new URL("http://server.com/api/"); 

URL url = new URL("http://server.com/api"); 

을 변경해야합니다 그리고 지금은 작동합니다. 어쩌면 누군가가 나에게 설명해 줄 수 있을지도 모른다. http://server.com/apicurl으로 열려고 시도하면 303 redirect에서 http://server.com/api으로 바뀝니다.

관련 문제