2014-01-21 5 views
1

Я пытаюсь отправить запрос json post с использованием HttpURLConnection в Scala. Я следовал вдоль двух учебных пособий и производится следующим образом:Использование HttpURLConnection для отправки запроса json POST

def sendPost(url: String, jsonHash: String) { 
    val conn: HttpURLConnection = new URL(url).openConnection().asInstanceOf[HttpURLConnection] 
    conn.setRequestMethod("POST") 
    conn.setRequestProperty("Content-Type", "application/json") 
    conn.setRequestProperty("Accept", "application/json") 
    conn.setDoOutput(true) 
    conn.connect() 

    val wr = new DataOutputStream(conn.getOutputStream) 
    wr.writeBytes(jsonHash) 
    wr.flush() 
    wr.close() 

    val responseCode = conn.getResponseCode 

    println("Sent: " + jsonHash + " to " + url + " received " + responseCode) 

    val in = new BufferedReader(new InputStreamReader(conn.getInputStream)) 
    var response: String = "" 
    while(response != null) { 
    response = in.readLine() 
    println(response) 
    } 
    in.close() 
} 

Он отвечает:

Sent: '{"schedule":"R/2014-02-02T00:00:00Z/PT24H", "name":"Scala-Post-Test", "command":"which scalac", "epsilon":"PT15M", "owner":"[email protected]", "async":false}' to http://localhost:4040/scheduler/iso8601 received 500 

java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:4040/scheduler/iso8601 

, вытекающие из

val in = new BufferedReader(new InputStreamReader(conn.getInputStream)) 

, но если бы я восстановить его в качестве curl запроса, он отлично работает :

curl -X POST -H 'Content-Type: application/json' -d '{"schedule":"R/2014-02-02T00:00:00Z/PT24H", "name":"Scala-Post-Test", "command":"which scalac", "epsilon":"PT15M", "owner":"[email protected]", "async":false}' http://localhost:4040/scheduler/iso8601 

requirement failed: Vertex already exists in graph Scala-Post-Test 

(что я ожидаю)

Любое понимание того, что не так? Я пытаюсь обнюхивать пакеты, чтобы определить, что по-другому.

(Примечание: я уже махнули на sys.process._)

+1

Используйте 'PrintWriter' (а не' DataOutputStream'). –

+1

^^ Игнорируйте это пока. Хотя здесь не обычно использовать 'DataOutputStream', в этом случае не имеет значения. Когда вы выводите строку 'jsonHash', она показывает ваш JSON, окруженный одинарными кавычками; это, наверное, проблема. –

+0

Aha! Вы правы, одинарные кавычки вызывали 500. - возможно, nc -l кажется таким же, как сейчас, но 400 Bad Request. Поиск продолжается. – Austin

ответ

4

вопрос здесь:

Sent: '{"schedule":"R/2014-02-02T00:00:00Z/PT24H", "name":"Scala-Post-Test", "command":"which scalac", "epsilon":"PT15M", "owner":"[email protected]", "async":false}' to http://localhost:4040/scheduler/iso8601 received 500 

Вы отметите свой JSON окружен одинарные кавычки. Это делает его недействительным.

Также стоит отметить, что хотя этот код работает, вы используете DataOutputStream.writeBytes() для вывода ваших данных. Это будет проблематично, если ваша строка содержит ничего, кроме однобайтовых символов; он разбивает 8 разрядов с каждого char (Java использует 2-байтовые символы для хранения кодовых точек UTF-16).

Лучше использовать что-то более подходящее для вывода String. Тот же метод, который вы используете для ввода, например:

BufferedWriter out = 
    new BufferedWriter(new OutputStreamWriter(conn.getOutputStream)); 
out.write(jsonString); 
out.close(); 
Смежные вопросы