2014-09-04 2 views
0

HTTP 요청을 통해 통신을 구현하는 동안 문제가 있습니다. 더 정확하게, 나는 발리 라이브러리를 사용했습니다이 내 클라이언트 측 요청입니다 :Android, Drupal 백엔드에 대한 HTTP POST 요청

StringRequest sr = new StringRequest(Request.Method.POST, "http://mysite/mydrupalservice", 
             new Response.Listener<String>() { 
              @Override 
              public void onResponse(String response) { 
               Log.w("CheckinFragment. POST call, RESPONSE:", String.valueOf(response)); 
              } 
             }, 
             new Response.ErrorListener() { 
              @Override 
              public void onErrorResponse(VolleyError error) { 
               VolleyLog.e("CheckinFragment. POST call, ERROR:", String.valueOf(error)); 
              } 
             }){ 

            @Override 
            protected Map<String,String> getParams() 
            { 
             Map<String,String> params = new HashMap<String, String>(); 
             params.put("action", "something"); 
             params.put("access_token", "something"); 
             params.put("activity", "1"); 
             return params; 
            } 

            @Override 
            public Map<String, String> getHeaders() throws AuthFailureError 
            { 
             Map<String,String> headers = new HashMap<String, String>(); 
             headers.put("Accept", "application/json"); 
             headers.put("Content-Type","application/json; charset=utf-8"); 
             headers.put("Connection", "keep-alive"); 
             return headers; 
            } 
           }; 

           // add the request object to the queue to be executed 
           Controller.getInstance().addToRequestQueue(sr);` 

이 코드는 제대로 안드로이드 측에서 실행되지만, 수신 된 응답은 다음과 같다 :

BasicNetwork.performRequest: Unexpected response code 404 for http://mysite/myservice 
android.volley.AuthFailureError. 

클라이언트 측 코드를 테스트하기 위해 http://httpbin.org/을 사용해 보았지만 제대로 작동합니다.

그래서 문제는 서버 쪽 일 수 있다고 생각했습니다. 예를 들어 Firefox의 확장 Poster를 사용하여 POST 매개 변수로 HTTP 요청을 수행하려고하면 서버에서 올바른 응답을받습니다.

401 오류 코드를 보면 이전에 Drupal에서 작성한 서비스에 사용자 인증이 필요하다고 생각했지만 그 옵션은 이전에는 비활성화되었습니다.

이 문제를 해결하는 방법을 모르겠지만 누구입니까? 관심을 가져 주셔서 감사합니다.

+0

Drupal 백엔드에 다른 "간단한"방법이 있습니까? 어쩌면 오류가 발생하는지 먼저 GET 메서드를 호출하려고합니다. – alpinescrambler

+0

예, 몇 가지 방법이 있습니다. 이들 모두는 HTTP Get 요청에 사용됩니다. – CatchMeIfUCan

답변

0

인코딩 된 URL을 사용해 볼까요? 예 :

@Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String,String> params = new HashMap<String, String>(); 
     params.put("Content-Type","application/x-www-form-urlencoded"); // try this 
     return params; 
    } 
+0

제안을 사용하여 내 문제를 해결했지만 "application/x-www-form-urlencoded"입력 유형을 허용하기 위해 drupal에서 생성 된 서비스의 "요청 구문 분석"옵션을 수정했습니다. drupal이 "application/json"입력 유형을 허용하지 않는 이유를 이해할 수 없습니다. – CatchMeIfUCan

+0

도움을 주셔서 감사합니다. StringRequest 대신 JsonObjectRequest를 사용하면 효과가있을 것입니다. – alpinescrambler

+0

한번 시도해 보겠습니다. 정말 고마워요. – CatchMeIfUCan